我遇到了这个问题,我很困惑。
我在bash中使用$ RANDOM作为在linux启动过程开始时的一个testingstring。 非常有趣的是,我观察到$ RANDOM每次启动时都是一样的。 就我而言,这是18869年。
我只是将$ RANDOM回显到一个文件。 我在每次启动时都观察到相同的数字。 之后,$ RANDOM似乎返回“真实”的随机数。
echo "$RANDOM is a test string" >> /tmp/test
任何人都可以解释这个原因吗?
以下是Bash 4.2源代码中来自variables.c
的初始种子算法:
static void seedrand () { struct timeval tv; gettimeofday (&tv, NULL); sbrand (tv.tv_sec ^ tv.tv_usec ^ getpid ()); }
换句话说,它基于pid和当前时间以秒和微秒(系统精度为〜1/100秒)产生种子。
如果在系统时钟初始化之前,在一个小的,可预测的系统上检查$RANDOM
,则每次都可能看到相同的值。
因为种子在启动时总是一样的。 您始终可以分配一个值
RANDOM=1000
手动播种RANDOM,也许用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