私は C/C++ で書いていて、100,000 より大きい乱数をたくさん作成したいと思っています。どうすればそれを行うことができますか?とrand();
4 に答える
ではそれを行いませんがrand
、新しい C++ に付属する適切な乱数ジェネレーターを使用します。たとえばcppreference.comを参照してください。
const int min = 100000;
const int max = 1000000;
std::default_random_engine generator;
std::uniform_int_distribution<int> distribution(min,max);
int random_int = distribution(generator); // generate random int flat in [min, max]
ジェネレーターを適切にシードすることを忘れないでください。
rand
上記では、通常、多くの欠点があるため、これは「適切な」疑似 RNG ではないことを暗示しています。最良のケースでは、抽象化が欠けているため、異なるディストリビューションからの選択が難しくなり、エラーが発生しやすくなります (「ランダム レンジ モジュラス」などで Web を検索してください)。また、乱数を生成するために使用される基本的なエンジンを置き換えることは、設計上不可能です。rand
疑似 RNG が多くの/ほとんどのユース ケースに対して十分な長さのシーケンス長を提供しないため、最適ではないケースです。TR1/C++11 を使用すると、高品質の乱数を生成するのは簡単で、常に適切なソリューションを使用できるため、あいまいなバグが発生したときに使用される疑似 RNG の品質について最初に心配する必要はありません。マイクロソフト
// Initialize rand()'s sequence. A typical seed value is the return value of time()
srand(someSeedValue);
//...
long range = 150000; // 100000 + range is the maximum value you allow
long number = 100000 + (rand() * range) / RAND_MAX;
range
for and number
if(100000 + range)
がその最大値を超える場合は、long int よりも大きなものを使用する必要がある場合があります。
一般に、0 から 1 の間の乱数ジェネレーターを使用し、次の変換を行うことで任意の範囲を取得できます。
x' = r x + b
たとえば、100,000 から 300,000 の間の乱数が必要で、x
0 から 1 の間の乱数である場合r
、200,000 とb
100,000 に設定するとx'
、必要な範囲内になります。
C++ ビルトインにまだアクセスできない場合、Boost にはBoost.Randomに実際のランダマイザーが多数あり、明らかな問題領域に対する特定のソリューションが含まれます。
質問の編集を明確にすることで回答の精度が向上するというコメントを繰り返します。「100,001 から 1,000,000 までの均一に分散された整数が必要です」。