質問: 繰り返される単一ステップのデバッグ≠デバッグの実行 Visual Studio 2010 UltimateでXNAでC#を使用しています。 私は、デバッグするために実行を停止した場合に結果に影響を与える可能性のあるタイミング、スレッド、その他のものを含まない計算を実行するプログラムを持っていますが、残りのプログラムを実行する前に何もしません。 プログラムが終了すると、出力が画面に表示されます。 このプログラムでは、出力が表示されるまで `F10` を押し続けると、デバッグ中または実行中に `F5` を押すだけで、 !steps これは、個々の `F10` ステップでの実行を示しています。 プログラムはシンプルな2人のプレーヤーのゲームを何度も実行し、ゲームはボード上でカウンターを動かし、両方のプレーヤーは自動化され、ランダムに移動します。 1回のラインにつき100回の試合が行われ、いくつかの試合が終了するまでに一定の回数が経過し、カウントされません。ランダムゲームのこれらの8セットから見ることができるように、それは非常にバランスが取れています。少なくとも、誰が勝つか、誰が緩めるかについてランダムに動きます。 次の図は、 `F5` での実行を示しています。 !run ゲームの実行はお互いに影響を及ぼさず、セットは停止してカウントを開始する場所に過ぎず、何も影響しません。しかし、最初のイメージとはまったく違って、我々は連続して100回のゲームをすべて獲得しましたが、2回後に連続して100の新しい無関係のゲームを失ってしまいました。 第2のイメージが与えられたときの明らかな答えは、私のプログラムロジックに何か問題があるということですが、そうではありません。そして、デバッガをゆっくり実行して問題をデバッグしようとすると、ゆっくりとしているので、何が起こっているのかがわかるようになっています。 何が間違っていますか?
回答: これがスレッドを使用していない場合、私の主な疑問は、おそらく `System.Random` クラスを使用している可能性があるということです。 `Next()`の呼び出しごとに、Randomクラスの*同じインスタンス*を必ず使用してください。 可能性のある問題は、 `Random` を使用してメソッドを素早く連続して呼び出すと(つまり、デバッガではなく正常に実行されているとき)、毎回新しいインスタンスを作成すれば、それはシステムクロックに基づいているので、同じシードでランダムインスタンスをシードします。デバッグを介して「スローダウン」すると、これが発生しないようになります。そのため、ステッピングデバッグセッション中に動作が改善されるのはこのためです。