$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