4

我遇到了这个问题,我很困惑。

我在 bash 中使用 $RANDOM 作为 linux 启动过程开始时的测试字符串。非常有趣的是,我观察到每次 linux 启动时 $RANDOM 都是一样的。就我而言,它是 18869。

我只是将 $RANDOM 回显到文件中。我在每次启动时都观察到相同的数字。之后, $RANDOM 似乎返回“真实”随机数。

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

任何人都可以解释其中的原因吗?

4

2 回答 2

5

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一个小型的、可预测的系统,在系统时钟初始化之前,您可能每次都看到相同的值。

于 2013-08-29T21:35:53.607 回答
0

因为种子在启动时总是相同的。您始终可以分配一个值

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/randomand的信息/dev/urandom,作为替代。另一种在没有种子问题的情况下生成随机数的方法是获取有关以纳秒为单位的实际时间的一些信息。

date +%N
于 2013-08-29T21:46:31.423 回答