3

高级 Bash 脚本指南9.3 章中。$RANDOM:生成随机整数

它说明了如何生成大于特定数字的随机数:

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

4

2 回答 2

1

问题可能来自溢出。假设您的 prng 生成一个介于 0 和 maxint 之间的数字。如果你只是简单地加上地板,当加法给出一个大于 maxint 的数字时会发生什么?当然,您可以简单地拒绝这些数字,但这会产生与您建议的算法相同的算法。

根据楼层的不同,可以使用一些技巧来最大程度地减少拒绝。例如,如果需要的数字大于 maxint / 2,您可以在测试拒绝之前系统地设置较高的位。

于 2011-04-07T11:42:47.277 回答
0

$RANDOM永远不会有大于 32767 的结果。但是,如果您期望结果介于$FLOOR32767 和 32767 之间,则添加$FLOORand$RANDOM对您没有帮助。如果您将任何大于 32767 的值视为 32767,那么您正在使您的生成器更可预测。通过修改结果(32767 - $FLOOR)并添加$FLOOR. 另一个没有循环的解决方案是使用$RANDOM * ( 32767 - $FLOOR ) / 32767 + $FLOOR,但 bash 缺乏浮点数学,并且由于舍入错误可能会丢失几个数字。

于 2011-04-07T13:01:28.987 回答