3

重複の可能性:
範囲内から乱数を生成する方法 - C

パールのプログラミングから次のコードを見ました

int randint(int l, int u)
{   return l + (RAND_MAX*rand() + rand()) % (u-l+1);
}

誰でも説明できますか?

使えますか

return l + rand() % (u-l+1);

ありがとう、

4

2 に答える 2

3

を使用して 0 から n-1 の間の数値を取得する際の問題rand() % nは、n が RAND_MAX の正確な約数でない場合にバイアスがかかることです。n の値が大きいほど、このバイアスは強くなります。

なぜこれが起こるのかを説明するために、rand() が六面体のサイコロで実装されると想像してみましょう。したがって、RAND_MAX は 5 になります。このサイコロを使用して 0 から 3 の間の乱数を生成するため、次のようにします。

x = rand() % 4

rand の 6 つの結果のそれぞれに対する x の値は?

0 % 4 = 0
1 % 4 = 1
2 % 4 = 2
3 % 4 = 3
4 % 4 = 0
5 % 4 = 1

ご覧のとおり、数値 0 と 1 は、数値 2 と 3 の 2 倍の頻度で生成されます。

ユース ケースで偏りが許容されない場合、乱数を計算するには次の方法が適しています。

 (int)((double)rand() / (double)RAND_MAX * (double)n)
于 2012-10-09T20:02:36.870 に答える
1

はい、大丈夫です。u>l を確認すると、次の操作しか実行できません。

return l + (RAND_MAX*rand()) % (u-l+1);

説明:

ユニオン分布でランダムな整数を生成したい場合は、次[0,N]N>0使用します。

 return (RAND_MAX*rand()) % (N+1);

あなたの場合、範囲は定数値lで区切られているので、最終結果に追加するだけです。

パイソンモデル:

>>> import random
>>> import sys
>>> for i in xrange(20):
    int(random.random()*sys.maxint%4)


0
1
2
3
1
1
2
2
3
0
3
3
0
2
3
3
1
2
2
3
于 2012-10-09T19:58:40.823 に答える