我一直$RANDOM用来生成1-15之间的随机数,以便在两个系统之间产生一点抖动.例如:
sleep $(( RANDOM %= 15 ))
Run Code Online (Sandbox Code Playgroud)
如果我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
Run Code Online (Sandbox Code Playgroud)
我的问题:
$RANDOM不适合加密,但为什么一般会产生随机数这么糟糕?RANDOM是一个提供伪随机数的特殊变量.通过使用模运算符,您极大地限制了可能的值,并且通过分配给RANDOM,您将种子值更改为受限集的某个成员,这最终似乎已经确定13.
以下给出了合理的分布:
for i in {1..100}; do echo $(( RANDOM % 15 )); done
Run Code Online (Sandbox Code Playgroud)
通过使用%=而不仅仅是%,您正在设置种子值.不要那样做.
| 归档时间: |
|
| 查看次数: |
757 次 |
| 最近记录: |