繰り返される単一ステップのデバッグ≠デバッグの実行

Visual Studio 2010 UltimateでXNAでC#を使用しています。

私は、デバッグするために実行を停止した場合に結果に影響を与える可能性のあるタイミング、スレッド、その他のものを含まない計算を実行するプログラムを持っていますが、残りのプログラムを実行する前に何もしません。

プログラムが終了すると、出力が画面に表示されます。

このプログラムでは、出力が表示されるまで F10 を押し続けると、デバッグ中または実行中に F5 を押すだけで、

steps

これは、個々の F10 ステップでの実行を示しています。

プログラムはシンプルな2人のプレーヤーのゲームを何度も実行し、ゲームはボード上でカウンターを動かし、両方のプレーヤーは自動化され、ランダムに移動します。 1回のラインにつき100回の試合が行われ、いくつかの試合が終了するまでに一定の回数が経過し、カウントされません。ランダムゲームのこれらの8セットから見ることができるように、それは非常にバランスが取れています。少なくとも、誰が勝つか、誰が緩めるかについてランダムに動きます。

次の図は、 F5 での実行を示しています。

run

ゲームの実行はお互いに影響を及ぼさず、セットは停止してカウントを開始する場所に過ぎず、何も影響しません。しかし、最初のイメージとはまったく違って、我々は連続して100回のゲームをすべて獲得しましたが、2回後に連続して100の新しい無関係のゲームを失ってしまいました。

第2のイメージが与えられたときの明らかな答えは、私のプログラムロジックに何か問題があるということですが、そうではありません。そして、デバッガをゆっくり実行して問題をデバッグしようとすると、ゆっくりとしているので、何が起こっているのかがわかるようになっています。

何が間違っていますか?

2
TYVM Reed CopseyとScott Chamberlain:¬)それぞれの "Random = new Random();"の間に長いループが発生していました。一見、それは十分に長くはなかった "rand"の使用の多くを含む。私は今これを一度だけ宣言しており、プログラムは動作します。
追加された 著者 alan2here,
@DerrickTurk:?
追加された 著者 George Duckett,
s/loose/lose/g
追加された 著者 Derrick Turk,

2 答え

これがスレッドを使用していない場合、私の主な疑問は、おそらく System.Random クラスを使用している可能性があるということです。 Next()の呼び出しごとに、Randomクラスの同じインスタンスを必ず使用してください。

可能性のある問題は、 Random を使用してメソッドを素早く連続して呼び出すと(つまり、デバッガではなく正常に実行されているとき)、毎回新しいインスタンスを作成すれば、それはシステムクロックに基づいているので、同じシードでランダムインスタンスをシードします。デバッグを介して「スローダウン」すると、これが発生しないようになります。そのため、ステッピングデバッグセッション中に動作が改善されるのはこのためです。

6
追加された

あなたがプレイヤーがランダムに動くと言ったという事実は、ループ内に new Random()を置く一般的なバグによって捕らえられる可能性が高いことを意味します。あなたのランダムなオブジェクトを静的にするか、またはループからそれを移動して、問題はなくなります。

3
追加された