重複の可能性:
範囲内から乱数を生成する方法 - C
パールのプログラミングから次のコードを見ました
int randint(int l, int u)
{ return l + (RAND_MAX*rand() + rand()) % (u-l+1);
}
誰でも説明できますか?
使えますか
return l + rand() % (u-l+1);
ありがとう、
重複の可能性:
範囲内から乱数を生成する方法 - C
パールのプログラミングから次のコードを見ました
int randint(int l, int u)
{ return l + (RAND_MAX*rand() + rand()) % (u-l+1);
}
誰でも説明できますか?
使えますか
return l + rand() % (u-l+1);
ありがとう、
を使用して 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)
はい、大丈夫です。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