Генерируйте случайную дату между двумя другими датами

Как я генерировал бы случайную дату, которая должна быть между двумя другими данными датами?

Подпись функции должна быть чем-то вроде этого:

random_date("1/1/2008 1:30 PM", "1/1/2009 4:50 AM", 0.34)
                   ^                       ^          ^

            date generated has  date generated has  a random number
            to be after this    to be before this

и возвратил бы дату, такую как: 2/4/2008 7:20 PM

118
задан Boris 30 August 2019 в 06:52
поделиться

6 ответов

Преобразуйте обе строки в метки времени (в Вашем выбранном разрешении, например, миллисекундах, секунды, часы, дни, безотносительно), вычтите ранее из позже, умножьте свое случайное число (предполагающий, что оно распределяется в range [0, 1]) с тем различием, и добавьте снова к более раннему. Преобразуйте метку времени назад в строку даты, и у Вас есть случайное время в том диапазоне.

пример Python (вывод находится почти в формате, который Вы указали, кроме 0, дополнение - обвиняет американские конвенции формата времени):

import random
import time

def str_time_prop(start, end, format, prop):
    """Get a time at a proportion of a range of two formatted times.

    start and end should be strings specifying times formated in the
    given format (strftime-style), giving an interval [start, end].
    prop specifies how a proportion of the interval to be taken after
    start.  The returned time will be in the specified format.
    """

    stime = time.mktime(time.strptime(start, format))
    etime = time.mktime(time.strptime(end, format))

    ptime = stime + prop * (etime - stime)

    return time.strftime(format, time.localtime(ptime))


def random_date(start, end, prop):
    return str_time_prop(start, end, '%m/%d/%Y %I:%M %p', prop)

print(random_date("1/1/2008 1:30 PM", "1/1/2009 4:50 AM", random.random()))
128
ответ дан Boris 24 November 2019 в 01:52
поделиться
from random import randrange
from datetime import timedelta

def random_date(start, end):
    """
    This function will return a random datetime between two datetime 
    objects.
    """
    delta = end - start
    int_delta = (delta.days * 24 * 60 * 60) + delta.seconds
    random_second = randrange(int_delta)
    return start + timedelta(seconds=random_second)

точность является секундами. Можно увеличить точность до микросекунд или уменьшиться к, скажем, получасу, если Вы хотите. Поскольку это просто изменяют вычисление последней строки.

выполненный пример:

from datetime import datetime

d1 = datetime.strptime('1/1/2008 1:30 PM', '%m/%d/%Y %I:%M %p')
d2 = datetime.strptime('1/1/2009 4:50 AM', '%m/%d/%Y %I:%M %p')

print(random_date(d1, d2))

вывод:

2008-12-04 01:50:17
97
ответ дан Boris 24 November 2019 в 01:52
поделиться

Концептуально это довольно просто. В зависимости от которого языка Вы используете Вас, сможет преобразовать те даты в некоторое ссылочное целое число на 32 или 64 бита, обычно представляя секунды с эпохи (1 января 1970), иначе известной как "Время Unix" или миллисекунды начиная с некоторой другой произвольной даты. Просто генерируйте случайное целое число на 32 или 64 бита между теми двумя значениями. Это должно быть одним лайнером на любом языке.

На некоторых платформах можно генерировать время как двойное (дата является целой частью, время является дробной частью, одна реализация). Тот же принцип применяется кроме, Вы имеете дело с числами одинарной точности с плавающей точкой, или числа двойной точности с плавающей точкой ("плавает" или "удваивается" в C, Java и других языках). Вычтите различие, умножьтесь случайным числом (0 < = r < = 1), добавьте ко времени начала и сделанный.

0
ответ дан cletus 24 November 2019 в 01:52
поделиться

Для чего Вы нуждаетесь в случайном числе? Обычно (в зависимости от языка) можно получить число секунд/миллисекунд с Эпохи с даты. Таким образом для randomd даты между startDate и endDate Вы могли сделать:

  1. вычисляют время в мс между startDate, и endDate (endDate.toMilliseconds () - startDate.toMilliseconds ())
  2. генерируют число между 0 и число, которое Вы получили в 1
  3. , генерируют новую Дату со смещением времени = startDate.toMilliseconds () + число, полученное в 2
1
ответ дан tehvan 24 November 2019 в 01:52
поделиться
  1. Преобразовывают Ваши входные даты в числа (интервал, плавание, независимо от того, что является лучшим для Вашего использования)
  2. Выбирают число между Вашими двумя числами даты.
  3. Преобразовывают это число назад в дату.

Много алгоритмов для преобразования даты к и от чисел уже доступны во многих операционных системах.

1
ответ дан mouviciel 24 November 2019 в 01:52
поделиться

Самый легкий способ сделать это состоит в том, чтобы преобразовать оба числа в метки времени, затем установить их как минимальные и максимальные границы на генераторе случайных чисел.

А быстрый пример PHP был бы:

// Find a randomDate between $start_date and $end_date
function randomDate($start_date, $end_date)
{
    // Convert to timetamps
    $min = strtotime($start_date);
    $max = strtotime($end_date);

    // Generate random number using above bounds
    $val = rand($min, $max);

    // Convert back to desired date format
    return date('Y-m-d H:i:s', $val);
}

Эта функция использует strtotime() для преобразования описания даты и времени в метку времени Unix, и date() для создания допустимой даты из случайной метки времени, которая была сгенерирована.

1
ответ дан ConroyP 24 November 2019 в 01:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: