初期化されていない変数をランダムな値として使用することは、実際には非常に悪い考えです。初期化されていない値を使用することは未定義の動作であるため、すべてが発生する可能性がありますが、実際には、ローカルの初期化されていない変数は、十分に再現可能な値を保持する場合があります。一部のコンパイラは、最適化時に、初期化されていない値の使用を削除する (または逆にその値を定数として設定する) ほど賢いです。これは、C または C++ 標準に準拠しています。
最近のC++11標準では、乱数用の非常に広範な API が定義されています。<random>
C++11 標準ヘッダーを参照してください。
つまり、初期化されていない値を出力すると、同じプログラムを同じマシンで何度も実行すると、実際には常に同じ値が得られる可能性があり、それをランダムな動作とは呼びません。もちろん、動作は実装固有です(システムごとに異なります。オペレーティング システム、コンパイラ、最適化フラグ、ユーザー構成または環境などに依存します...)。
疑似乱数ジェネレーター(たとえば、random(3)またはlrand48(3) ... を参照) を使用して、ランダムな入力をシードすることをお勧めします。Linux では、( urandom(4)/dev/urandom
を注意深く読んでください...)から数バイトを読み取るか、現在の時刻を現在の pid と組み合わせて ( time(2)およびgetpid(2)を参照)、シードを取得できます。
また、乱数はあまり意味がなく、実際にランダム性を正確に定義することは困難です (数学者、確率の専門家に尋ねてください)。
乱数は本当に難しい問題です。あなたはそれに一生を費やして博士号を取得することができます....
デバッグ目的で、疑似乱数の再現可能なストリームが必要になる場合があります。それを得るには、明確に定義されたシードを使用します。
あなたの問題が本当にランダムで予測不可能な数のストリームに決定的に依存している場合 (たとえば、ポーカー Web サイトをコーディングしている場合)、数百ユーロ (または数ドル) を費やしてハードウェア ランダム デバイスを購入する価値があります。