最良の答えは<random>
です。C ++ 11より前のバージョンを使用している場合は、代わりにBoost乱数のものを見ることができます。
しかし、私たちが話している場合、rand()
最良のsrand()
単純な方法は単に使用することです:time()
int main()
{
srand(time(nullptr));
...
}
これは、プログラムの最初に行うようにしてください。電話をかけるたびに行う必要はありませんrand()
。
サイドノート:
注:以下のコメントには、これが安全でないことについての議論があります(これは真実ですが、最終的には関連性がありません(続きを読む))。/dev/random
したがって、別の方法は、ランダムデバイス(または他の安全な実数(er)乱数ジェネレーター)からシードすることしかし:これであなたを誤った安心感に陥らせないでください。これはrand()
私たちが使用しているものです。見事に生成されたシードを使用してシードした場合でも、予測可能です(値がある場合は、次の値の完全なシーケンスを予測できます)。"pseudo"
これは、ランダムな値を生成する場合にのみ役立ち
「安全」が必要な場合は、おそらく使用する必要があります<random>
(ただし、セキュリティ情報のあるサイトでもう少し読んでみます)。出発点として以下の回答を参照してください:https ://stackoverflow.com/a/29190957/14065より良い回答については。
二次的な注意:ランダムデバイスを使用すると、実際には、以下の元の提案よりも1秒あたり複数のコピーを開始する問題が解決されます(セキュリティの問題ではありません)。
元の話に戻る:
起動するたびに、time()は一意の値を返します(アプリケーションを1秒間に複数回起動しない限り)。32ビットシステムでは、60年程度ごとにしか繰り返されません。
時間が十分にユニークだとは思わないことは知っていますが、それは信じがたいことです。しかし、私は間違っていることが知られています。
アプリケーションの多数のコピーを同時に開始する場合は、より細かい解像度のタイマーを使用できます。ただし、値が繰り返されるまでの期間が短くなるリスクがあります。
OK、それで、あなたが本当にあなたが1秒間に複数のアプリケーションを始めていると思うなら。
次に、タイマーでより細かい粒子を使用します。
int main()
{
struct timeval time;
gettimeofday(&time,NULL);
// microsecond has 1 000 000
// Assuming you did not need quite that accuracy
// Also do not assume the system clock has that accuracy.
srand((time.tv_sec * 1000) + (time.tv_usec / 1000));
// The trouble here is that the seed will repeat every
// 24 days or so.
// If you use 100 (rather than 1000) the seed repeats every 248 days.
// Do not make the MISTAKE of using just the tv_usec
// This will mean your seed repeats every second.
}