2011-01-21 11 views
1

vb 6.0の乱数が生成されますが、アプリケーションを終了してもう一度やり直すと、乱数生成の順序はドットネットと同じではなく、乱数生成が完璧です!どのように可能ですか?それの背後にある論理は何ですか?乱数生成の背後にある基本的な論理は何ですか?

+0

関連のないコメントとして、必要なときに常に新しい「ランダム」をインスタンス化しないでください。あなたのアプリケーション全体に静的なものを宣言してください。これはより効率的であるばかりでなく、よりランダムでもあります。タイトなループの中で新しい「ランダム」をインスタンス化するときに問題に遭遇しました。 – Timwi

+1

@ティムウィィ:あなたが必要とするたびに新しい「ランダム」を発射しないことについての良いアドバイスですが、アプリ全体に静的な「ランダム」を共有することは、それ自体の落とし穴があります。 'Random'クラスはスレッドセーフではありませんので、アプリケーション全体で共有している場合は、何らかの形で(ロックなどで)同期が取られていることを確認するか、' ThreadStatic'/'ThreadLocal 'を使用する必要があります。静的なプレーン。 – LukeH

+0

@LukeH:良い点、ありがとう! – Timwi

答えて

11

ランダムジェネレータは、基本的に決定的な関数であり、ある数値から別の数値になります。特定の値から開始すると、常に同じ結果が得られます。ランダムジェネレータへの最初の入力は、現在の時間から生成されます(これはシードと呼ばれます)。 .NETはデフォルトとしてvb 6.0を使用しているとは限りません。 J.フォンノイマン

から

引用は、乱数を生成する演算方法を考慮いずれも罪の状態では、当然のことながら、です。

0

ドットネットRandomでは、クラスは現在のシステム時刻をシードとして使用します。 vb 6.0は常に同じシードを使用しているようです。

2

本当に乱数を提供することは、常にコンピュータサイエンスにおいて最も難しい課題の1つです。問題は解決されません。 .NETで乱数生成は決して「完全」ではないことを保証できます。 VB6よりも優れたノッチです。

Redgate Reflector revelas .NETでは、クラスRandom()のデフォルトのコンストラクタは、デフォルトのシード(前回のブートからのミリ秒)としてEnvironment.TickCountを提供します。 VB6にはおそらくデフォルト値としての定数があります。

+3

最初の声明に同意できません。様々なエントロピー源に基づいて任意の強さの乱数を提供することは、深く研究され、完全に解決された問題であり、何十年も前からそうであった。決定された攻撃者に脆弱ではないような実装を作成することは技術的な課題ですが、それはエンジニアリングの問題であり、コンピュータサイエンスの問題ではありません。Randomクラスで提供されているような疑似乱数ジェネレータはもちろん無作為ではありません。真の乱数生成の問題を解決しようとすることさえありません。 –

0

私は

Random r = new Random(Environment.TickCount); 

としてその同じ新しいランダムクラスをインスタンス化する際に、この番号は、VB6で

+0

これは、Reflectorを開いて、Randomのデフォルトのコンストラクタを見ると、基本的に見えます。 public Random():this(Environment.TickCount){} –

2

異なっているなぜ、人は通常

を呼び出していることを数日前に言われました毎回異なる順序の番号を取得するために、
Randomize Timer 

関連する問題