我在Visual Studio2010旗舰版中使用C#和XNA。
我有一个程序,它执行一些不涉及计时、线程或任何其他可能影响结果的计算,如果我停止执行以进行调试,但在继续运行程序的其余部分之前没有做任何事情。
最后,程序会将一些输出打印到屏幕上。
在此程序中,重复按F10直到显示输出,所产生的结果与仅按F5在调试时运行或不调试时运行所产生的结果不同,这两种情况都会产生错误的结果。

这显示了具有单个F10步骤的运行。
该程序多次运行一个简单的双人游戏,游戏涉及到在棋盘上移动计数器,两个玩家都是自动的,随机移动。每行发生100场游戏,一些游戏在一定数量的围棋到期之前不会结束,因此不会计算在内。从这8组随机游戏中可以看出,这是相当平衡的,至少对于随机采取行动的玩家来说,谁会赢谁会输。
下图显示了使用F5运行的情况。

有些东西不在这里,游戏运行不会相互影响,设置只是停止和开始计数的地方,它们不会影响任何东西。然而,与第一张图片非常不同的是,我们连续赢得了所有100场比赛,两次,但随后又连续两盘输掉了100场全新的无关游戏。
给出第二张图片的明显答案是,我的程序逻辑有问题,但实际上并没有问题。当我去调试问题时,运行调试器的速度很慢,这样我就可以看到发生了什么事情来修复它,这让人沮丧。
会出什么问题呢?
发布于 2011-11-25 02:49:30
如果这不是在使用线程,那么我的主要怀疑是可能有什么东西在使用System.Random类。确保对Next()的每次调用都使用Random类的相同实例。
可能的问题是,如果您使用Random快速连续调用一个方法(即:在正常运行时,而不是在调试器中),并且每次都创建一个新实例,那么您很可能会用相同的种子来播种随机实例,因为它是基于系统时钟的。通过调试“减慢它”可以防止这种情况发生,这就是为什么在单步调试会话期间行为会更好。
发布于 2011-11-25 02:49:29
你说玩家的移动是随机的,这意味着你很可能会被常见的将new Random()放入循环中的错误所困扰。让你的随机对象成为静态的,或者把它移出循环,你的问题就会消失。
https://stackoverflow.com/questions/8261386
复制相似问题