在高级Bash-Scripting指南 Chaper 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 :(得分:1)
问题可能来自溢出。假设您的prng生成一个介于0和maxint之间的数字。如果你只是添加地板,当加法给出的数字大于maxint时会发生什么?当然,您可以简单地拒绝这些数字,但这会产生与您提议的算法相同的算法。
根据地板的不同,可以使用一些技巧来减少拒绝。例如,如果需要的数字大于maxint / 2,则可以在测试拒绝之前系统地设置较高位。
答案 1 :(得分:0)
$RANDOM
的结果不会超过32767.但是,如果您期望$FLOOR
和32767之间的结果,则添加$FLOOR
和$RANDOM
赢了不帮你如果您将任何大于32767的值视为32767,那么您可以使您的生成器更具可预测性。通过(32767 - $FLOOR)
修改结果并添加$FLOOR
并不是很糟糕。没有循环的另一个解决方案是使用$RANDOM * ( 32767 - $FLOOR ) / 32767 + $FLOOR
但是bash缺少浮点数学,并且由于舍入误差可能会错过几个数字。