Вы можете превратить задачу в генерацию случайного числа между числом, представляющим первую возможную дату, и числом, представляющим последнюю возможную дату (, на самом деле сразу после последней возможной )в формате эпохи unix. Все остальное обрабатывается стандартными преобразованиями даты. gawk
имеет лучшее разрешение случайных чисел, чемbash
(float по сравнению с 15-битным целым числом ), поэтому я буду использовать gawk
. Обратите внимание, что результат rand()
N — это число с плавающей запятой, такое что 0 <= N < 1, поэтому верхний предел увеличивается ниже, это предел, который нельзя перевернуть. Есть необязательный третий параметр для количества результатов.
#!/usr/bin/gawk -f
BEGIN {
first=mktime(ARGV[1] " 01 01 00 00 00")
last=mktime(ARGV[2]+1 " 01 01 00 00 00")
if (ARGC == 4) { num=ARGV[3] } else { num=1 }
ARGC=1
range=last-first
srand(sprintf("%d%06d", systime(), PROCINFO["pid"]))
for (i=1; i <= num; i++) {
print strftime("%d/%m/%Y", range*rand()+first)
}
}
Например:
./randomdate.gawk 1987 2017 6
26/04/1992
28/04/2010
21/04/2005
17/02/2010
06/10/2016
04/04/1998
"Кажется, рекомендуется перезагрузить компьютер"... это особенность Windows, кажется, рекомендуется практически для всего. Нет, перезагружаться не нужно. Но посмотрите, что вызвало состояние OOM --, был ли процесс, который был убит, или какой-то другой процесс (es )начал потреблять слишком много памяти. Кроме того, посмотрите, не нужно ли вам освободить место подкачки на этой машине.