3

Advanced Bash-Scripting Guide Chaper 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

$RANDOM32767 を超える結果が得られることはありません。ただし、32767 から 32767 の間の結果が予想される場合は、 and$FLOORを追加しても役に立ちません。32767 より大きい値を 32767 として扱うと、ジェネレーターがより予測しやすくなります。結果を変更して を追加することはそれほど悪くありません。ループを使用しない別の解決策は使用することですが、bash には浮動小数点演算がなく、丸め誤差のためにいくつかの数値を見逃す可能性があります。$FLOOR$RANDOM(32767 - $FLOOR)$FLOOR$RANDOM * ( 32767 - $FLOOR ) / 32767 + $FLOOR

于 2011-04-07T13:01:28.987 に答える