Генерация случайной даты между двумя другими датами - PullRequest
109 голосов
/ 16 февраля 2009

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

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

randomDate("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

Ответы [ 23 ]

0 голосов
/ 16 февраля 2009

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

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

0 голосов
/ 16 июня 2013

Используйте ApacheCommonUtils для генерации случайного длинного в заданном диапазоне, а затем создать дату из этого долго.

Пример:

import org.apache.commons.math.random.RandomData;

import org.apache.commons.math.random.RandomDataImpl;

публичная дата nextDate (минимальная дата, максимальная дата) {

RandomData randomData = new RandomDataImpl();

return new Date(randomData.nextLong(min.getTime(), max.getTime()));

}

0 голосов
/ 11 ноября 2010

В питоне:

>>> from dateutil.rrule import rrule, DAILY
>>> import datetime, random
>>> random.choice(
                 list(
                     rrule(DAILY, 
                           dtstart=datetime.date(2009,8,21), 
                           until=datetime.date(2010,10,12))
                     )
                 )
datetime.datetime(2010, 2, 1, 0, 0)

(нужен Python dateutil библиотека - pip install python-dateutil)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...