Как создать последовательность случайных дат с заданным интервалом года?

Как можно создать последовательность случайных дат с заданным интервалом года?

Вот один из способов, в основном в awk:

 #!/bin/sh [ "$end" -ge "$start" ] || exit 1 awk -v start=$1 -v end=$2 ' BEGIN { srand(); for(i=1; i {amp}lt;= 6; i  ) printf "d/d/%dn", 1   rand() * 28, 1   rand() * 12, start   rand() * (end-start); } ' {amp}lt; /dev/null 

Сценарий оболочки принимает два параметра и передает их как переменные в awk, который не читает входные данные и выполняет всю работу в блоке BEGIN .

После заполнения генератора случайных чисел он зацикливается 6 раз над оператором printf . Этот оператор печати выбирает подмножество возможных дат в диапазоне, генерируя случайное число от 1 до 28 для дня (безопасное для февраля), от 1 до 12 для месяца и между заданными начальным и конечным годами. Это случайно, но это не полный охват — он никогда не будет печатать дни 29-31 за месяцы, в которых они есть.

Другой способ, используя GNU date и bash:

 #!/bin/bash start=$1 end=$2 [[ "$start" -le "$end" ]] || exit 1 startsec=$(date -d "1/1/$start"  %s) for((i=1; i{amp}lt;=6; i  )) do r=$((RANDOM % (1   end - start)*365*24*60*60)) date -d @$((startsec   r))  %d/%m/%Y done 

Он работает, вычисляя секунды с момента появления первого января 1-го числа в дату начала, затем для каждого цикла получается случайное число смещенных секунд, которые нужно добавить; случайное число ограничено количеством секунд, охватывающих данный диапазон. GNU date затем манипулирует этой датой в желаемом формате.

Понравилась статья? Поделиться с друзьями:
JavaScript & TypeScript
Adblock
detector