$RANDOM в linux bash всегда будет одинаковым при загрузке

Я столкнулся с этой проблемой, и я так растерялся.

Я использую $RANDOM в bash в качестве тестовой строки в самом начале процесса загрузки linux. Очень интересно, что я заметил, что $RANDOM будет одинаковым при каждой загрузке Linux. В моем случае это 18869.

Я просто возвращал $RANDOM в файл. Я наблюдал одно и то же число в каждой загрузке. После этого $RANDOM, похоже, возвращает "реальные" случайные числа.

echo "$RANDOM is a test string" >> /tmp/test

Кто-нибудь может объяснить причину в этом?

2 ответа

Вот начальный начальный алгоритм из variables.c в исходном коде Bash 4.2:

static void                                                                                               
seedrand ()                                                                                               
{                                                                                                         
  struct timeval tv;                                                                                      

  gettimeofday (&tv, NULL);                                                                               
  sbrand (tv.tv_sec ^ tv.tv_usec ^ getpid ());                                                            
}  

Другими словами, он генерирует начальное значение на основе pid и текущего времени в секундах и микросекундах (с точностью системы ~1/100 секунды).

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

Потому что семя всегда одинаково при запуске. Вы всегда можете присвоить значение

RANDOM=1000

посеять СЛУЧАЙНО вручную, возможно, с помощью PID

RANDOM=$$

Пытаясь найти свое семя, я написал этот небольшой сценарий

for ((i=-150000; i<150000 ;i=i+1)); do
  RANDOM=$i;
  echo "$i: $RANDOM $RANDOM $RANDOM";
done | grep "18869[^:]"

и нашел:

-118657: 8608 18869 19673
-108446: 18869 18855 15976
-78471: 694 18869 19296
-75678: 18869 23165 7967
-42910: 18869 27476 32727
-38285: 25548 18869 18919
-10142: 18869 31786 24719
27971: 18869 6258 29786
33149: 13707 18869 8396
60739: 18869 10568 21777
73335: 5793 18869 8019
93507: 18869 14878 13769
113521: 30647 18869 7642
126275: 18869 19188 5761
137004: 18869 3793 18604

Посмотрите, что этот скрипт имеет много $RANDOM но все еще полностью детерминистичен, он всегда будет одинаковым, если вы его назовете. Эта ссылка имеет больше информации о $RANDOM и эта другая ссылка содержит информацию о том, как использовать /dev/random а также /dev/urandom, как альтернатива. Другой способ создать случайное число без начального числа - это получить некоторую информацию о фактическом времени в наносекундах.

date +%N
Другие вопросы по тегам