1

rand() を使用して乱数を作成しています。コードを実行すると:

int lowest=10000, highest=90000000000;
int range=(highest-lowest)+1;
for (int index=1; index<2; index++){
c = lowest+int(range*rand()/(RAND_MAX + 1.0));

C は、正と負の両方の数値として返されます。これはなぜですか、どうすれば修正できますか?

4

1 に答える 1

5

range * rand()溢れ出して包み込んでいるからです。

このアプローチは「修正」できません。可能な値を取得するだけRAND_MAXで、range選択されない大きな穴が残るためです。(または、(INT_MAX - INT_MIN + 1) / (RAND_MAX + 1)が より小さい場合RAND_MAX、取得できる個別の結果の数です)

新しい C++11 乱数ジェネレーターを使用します。

C++11 を使用できない場合は、ビットシフトと OR 演算子を使用して、複数のrand()結果を 1 つの数値に結合します。範囲外の数値を取得した場合は、もう一度やり直してください。ある範囲を別の範囲にマッピングする方法は、一様分布など、疑似乱数の優れた特性のほとんどを壊します。

于 2013-07-14T23:57:54.677 に答える