$ RANDOM ведет себя странно - PullRequest
       74

$ RANDOM ведет себя странно

0 голосов
/ 03 октября 2018

Я пытаюсь сгенерировать случайное время и дату с помощью кода, найденного в сети.Этот код использовал $ RANDOM.Странно то, что я мог продолжать выполнять скрипт, но результат даты и времени никогда не изменится.Но когда я добавляю «echo $ Random», результат даты и времени меняется.Это как-то связано с заполнением случайной величины и выполнением «эха», каким-то образом сбрасывает его?

#echo $RANDOM // This causes desire output
x=$(date -d "$((RANDOM%1+2010))-$((RANDOM%12+1))-$((RANDOM%28+1)) $((RANDOM%23+1)):$((RANDOM%59+1)):$((RANDOM%59+1))" '+%d-%m-%Y %H:%M:%S')
echo $x

ВЫХОД

INT,1,100128,2018/05/24 08:00:00,1,0,Test
INT,1,100128,2018/05/24 08:00:00,1,0,Test
INT,1,100128,2018/05/24 08:00:00,1,0,Test
INT,1,100128,2018/05/24 08:00:00,1,0,Test

1 Ответ

0 голосов
/ 03 октября 2018

Ответ на вопрос о посеве и эффекте echo см. В $ RANDOM: генерировать случайное целое число в Расширенном руководстве по написанию сценариев .Короче говоря, значение $RANDOM (предполагается, что оно) автоматически добавляется к случайному значению при каждом запуске Bash, но его можно повторно заполнить, установив для него постоянное значение, если вам нужно, чтобы оно производило одинаковую последовательность чиселмногократно.Выполнение echo $RANDOM не приведет к повторному заполнению $RANDOM, но заставит его перейти к следующему «случайному» значению, если оно уже было высеяно.

Насколько я могу судить, Бабун - просто Cygwinс некоторыми добавленными инструментами и конфигурациями.Я не видел ничего похожего на проблему, о которой ОП сообщает Cygwin Bash.Предполагая, что OP работает на Bash (а не на Zsh, что, по-видимому, также предоставляет Бабун), наиболее вероятная причина проблемы заключается в том, что что-то заново набирает $RANDOM до постоянного значения.Я предлагаю дважды проверить код, чтобы убедиться, что нет никаких назначений для RANDOM.Как только это исключено, следующим очевидным подозрением является один из файлов запуска Babun для Bash, потому что он утверждает, что выполняет настройки оболочки.

Если что-либо повторное заполнение RANDOM не может быть идентифицировано или исправлено, единственнымвариант, который приходит на ум, состоит в том, чтобы повторно заполнить его в коде чем-то достаточно случайным.В статье, упомянутой выше, предлагается

RANDOM=$$

Это очень слабый вариант, но в этом случае он может быть достаточно хорошим.Если это не так, есть другие предложения в статье, упомянутой выше (например, /dev/urandom).См. Также Почему на некоторых машинах $ RANDOM Bash не заполняется (?)? , Функция Unix $ RANDOM не случайна в терминале Bash , а $ RANDOM в linux bash всегда будетбыть таким же при загрузке .

...