2

ガベージ値を使用して乱数を生成するというこのアイデアに出くわしました。Cでは、初期化されていない変数にはガベージ値が与えられます(しかし、私のgeanyで試してみると0になります)。したがって、50〜60の乱数を取得したい場合。ガベージ値のモジュラスを取得して、乱数の初期制限に追加できますか? ただし、初期化されていない変数は、この投稿のようにガベージ値の代わりにゼロを返します

int i;
int LowerLimit=50;
int UpperLimit=60;
int RandomNumber = i%(UpperLimit-LowerLimit) + LowerLimit;

また、100 個の初期化されていない変数を使用して、それらの組み合わせを使用して確率変数を生成するとどうなるでしょうか。

4

2 に答える 2

7

初期化されていない変数をランダムな値として使用することは、実際には非常に悪い考えです。初期化されていない値を使用することは未定義の動作であるため、すべてが発生する可能性がありますが、実際には、ローカルの初期化されていない変数は、十分に再現可能な値を保持する場合があります。一部のコンパイラは、最適化時に、初期化されていない値の使用を削除する (または逆にその値を定数として設定する) ほど賢いです。これは、C または C++ 標準に準拠しています。

最近のC++11標準では、乱数用の非常に広範な API が定義されています。<random>C++11 標準ヘッダーを参照してください。

つまり、初期化されていない値を出力すると、同じプログラムを同じマシンで何度も実行すると、実際には常に同じ値が得られる可能性があり、それをランダムな動作とは呼びません。もちろん、動作は実装固有です(システムごとに異なります。オペレーティング システム、コンパイラ、最適化フラグ、ユーザー構成または環境などに依存します...)。

疑似乱数ジェネレーター(たとえば、random(3)またはlrand48(3) ... を参照) を使用して、ランダムな入力をシードすることをお勧めします。Linux では、( urandom(4)/dev/urandomを注意深く読んでください...)から数バイトを読み取るか、現在の時刻を現在の pid と組み合わせて ( time(2)およびgetpid(2)を参照)、シードを取得できます。

また、乱数はあまり意味がなく、実際にランダム性を正確に定義することは困難です (数学者、確率の専門家に尋ねてください)。

乱数は本当に難しい問題です。あなたはそれに一生を費やして博士号を取得することができます....

デバッグ目的で、疑似乱数の再現可能なストリームが必要になる場合があります。それを得るには、明確に定義されたシードを使用します。

あなたの問題が本当にランダムで予測不可能な数のストリームに決定的に依存している場合 (たとえば、ポーカー Web サイトをコーディングしている場合)、数百ユーロ (または数ドル) を費やしてハードウェア ランダム デバイスを購入する価値があります。

于 2013-10-26T08:00:41.557 に答える
2

初期化されていない変数は、宣言されているが、使用前に明確な既知の値に設定されていない変数です。ある程度の価値はありますが、予測可能なものではありません。つまり100、乱数を 1000 回生成し、1001 回目に別の数を取得したとしても、変数に格納されている可能性があります。これは良い考えではありません。何かが定義されていない場合、何が起こるかまったくわかりません。また、乱数の生成には適切なアルゴリズムが必要であり、プログラマーが無知であるということではありません。

これは非標準です。SOは標準コーディングを期待していると思います。

于 2013-10-26T07:59:02.223 に答える