2

私はこのセクションを読んでいて、最後の段落では、サンプルコードはスレッドセーフではないと述べていました。私の質問は、ランダム性を高めるのに役立ちませんか(つまり、複数のスレッドがそれらの行を同時に実行する場合)?

4

4 に答える 4

7

PRNGは注意深く設計されており(おそらくRANDUではないかもしれません)、予測可能で十分にランダムに分散された結果が得られます。それらは真にランダムである必要はありません。統計的品質テストを満たし、十分な期間を生成し、同じシードで決定論的である必要があります。

複数のスレッドからジェネレーターを同時に使用する場合、これらの保証はすべて無駄になります。最も重要なことは、再現可能な結果を​​得ることができないことです(これはシミュレーションで非常に重要です)。次に、状態が変化するか、異なるスレッドで同じ番号を2回取得する可能性があります。

あなたは間違いなくそこに行きたくない。スレッドごとに1つのPRNGを作成します(できれば、線形独立のシードを使用して)。

于 2012-08-23T21:16:22.407 に答える
4

スレッドセーフではない乱数ジェネレーターで発生する可能性のある副作用の1つは、何らかの方法で内部状態が破損する可能性があることです。たとえば、Random2つの異なるスレッドから.NETの同じインスタンスにアクセスしている場合、0を繰り返し返すだけの状態にすることができます。

リンクするRNGでは、特定の問題が発生する可能性はないように見えますが、一部の縮退した同時アクセスパターンが0に設定される可能性がありますm_zm_wこれは、コメントによると悪いことです。

于 2012-08-23T21:17:07.673 に答える
0

スレッドのタイミング生成からエントロピーを取得することは間違いありませんが、エントロピーの収集と疑似乱数の生成を、ジョーイが言ったように、前者が後者の証明可能なプロパティに干渉する可能性がある方法で混合することは非常に悪い考えです。私が新しい答えを追加する理由は、代わりに実際のエントロピーをPRNGと混合することを検討する可能性があるためです(シードとして、または定期的に追加を導入する)。異なるスレッドから実際のタイミング情報を収集することは、エントロピーの1つの可能なソースです。ただし、未定義の動作を呼び出してエントロピーを取得することを期待するのではなく、厳密に(結果を格納するための適切なロックまたはロックフリーのアトミック操作を使用して)実行する必要があります。

于 2012-08-23T22:45:13.363 に答える
0

コードが非スレッドセーフである多くの方法があります。

1つの方法は、スレッドが他のスレッドによって行われたメモリへの書き込みを認識できないことです。

他のスレッドによって行われた作業を「見る」ことは決してないため、すべてゼロを生成する乱数生成が見つかる可能性があります。

于 2012-08-23T22:48:04.560 に答える