生成大于特定数字的随机数

时间:2011-04-07 10:42:30

标签: bash random prng

高级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,所以我不知道它是什么问题。

2 个答案:

答案 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缺少浮点数学,并且由于舍入误差可能会错过几个数字。