2011-04-07 59 views
3

高级Bash脚本编程指南章中9.3. $RANDOM: generate random integer产生一个随机数比特定数量多

它说明了如何产生比具体数目更大的随机数:

FLOOR=200 

number=0 #initialize 
while [ "$number" -le $FLOOR ] 
do 
    number=$RANDOM 
done 
echo "Random number greater than $FLOOR --- $number" 
echo 

然后评论说:

# Let's examine a simple alternative to the above loop, namely 
#  let "number = $RANDOM + $FLOOR" 
# That would eliminate the while-loop and run faster. 
# But, there might be a problem with that. What is it? 

我认为它仍然是随机的,并且大于$FLOOR,所以我不知道它是什么问题。

+0

我不认为这是一个bash的具体问题,更是一个PRNG问题。我猜这会损害生成的随机数的质量,要看这个空间以获得一个合格的答案:) – Torp 2011-04-07 11:14:09

+0

感谢您的建议:DI编辑标题和标记 – Vayn 2011-04-07 11:32:38

+0

我也有同样的问题 – Tracy 2011-04-07 11:38:14

回答

1

该问题可能来自溢出。假设你的prng产生一个介于0和maxint之间的数字。如果您只是简单地添加楼层,那么当添加的数字大于maxint时会发生什么情况?当然,你可以简单地拒绝这些数字,但它会产生与你所提议的算法相同的算法。

根据地板的情况,可以使用一些技巧来减少拒收。例如,如果需要的数字大于maxint/2,则可以在测试拒绝之前系统地设置较高位。

0

$RANDOM永远不会有大于32767的结果。然而,如果你希望$FLOOR和32767之间的结果,增加$FLOOR$RANDOM不会帮你。如果你将任何大于32767的值都视为32767,那么你正在使你的发生器更具可预测性。不是很糟糕的是通过(32767 - $FLOOR)修改您的结果并添加$FLOOR。没有循环的另一种解决方案是使用$RANDOM * (32767 - $FLOOR)/32767 + $FLOOR,但bash缺乏浮点数学运算,并且由于舍入误差可能会错过几个数字。

+0

那个手册的答案因为限制范围并不是随机的,尽管如果你使用bash进行加密或者其他操作,那么你做错了。 – mkb 2011-04-07 13:03:35