我一直$RANDOM
用来生成1-15之间的随机数,以便在两个系统之间产生一点抖动.例如:
sleep $(( RANDOM %= 15 ))
如果我echo $(( RANDOM %= 15 ))
每隔几分钟运行一次,那么随机数似乎相当随机.但是,如果我每隔一分钟通过cron开始运行一个带有此调用的脚本,或者甚至只是每隔几秒钟回显一次随机数,随机性就会消失在我的Mac上,我最终会得到11和6之类的非随机值,依次交替,或8,4和2.不是很随机.
在我的一个Linux服务器(CentOS 6.5 x64)上,我添加了以下bash脚本,在第一次循环之后,只是13
一遍又一遍地输出:
#!/bin/bash for ((n = 0; n < 100; n++)) do echo $(( RANDOM %= 15 )) done
我的问题:
为什么会这样?我知道$RANDOM
不适合加密,但为什么一般会产生随机数这么糟糕?
有没有其他简单的方法可以通过bash脚本获得更随机的数字(即使需要快速连续)?
Todd A. Jaco.. 6
RANDOM是一个提供伪随机数的特殊变量.通过使用模运算符,您极大地限制了可能的值,并且通过分配给RANDOM,您将种子值更改为受限集的某个成员,这最终似乎已经确定13
.
以下给出了合理的分布:
for i in {1..100}; do echo $(( RANDOM % 15 )); done
通过使用%=
而不仅仅是%
,您正在设置种子值.不要那样做.