我在Visual Studio 2010 Ultimate中使用C#和XNA。
我有一个程序执行一些计算,不涉及计时,线程或任何可能影响结果的事情,如果我停止执行调试,但在继续运行程序的其余部分之前没有做任何事情。
结束时程序会将一些输出打印到屏幕上。
在此程序中反复按F10
直到显示输出产生的结果与在调试时运行F5
而不调试运行时产生的结果不同,这两者都会产生错误的结果。
这显示了具有单独F10
步骤的运行。
该程序多次运行一个简单的双人游戏,游戏涉及在棋盘上移动计数器,两个玩家都是自动化的并随机移动。每行发生100场比赛,有些比赛在一定数量的比赛结束之前没有结束且不计算在内。从这8组随机游戏中可以看出,它非常平衡,至少对于那些随意采取行动的玩家来说,哪些人会赢,谁会松动。
下图显示了F5
的运行。
有些事情不在这里,游戏运行不会相互影响而且集合只是一个停止和开始计数的地方,它们不起作用。然而,与第一张图片完全不同的是,我们连续赢了100场比赛,两次但后来又连续两场失去了100场全新的无关游戏。
第二张图片的明显答案是我的程序逻辑有问题,但是没有。令人沮丧的是,当我慢慢地调试运行调试器的问题时,我可以看到发生了什么修复它。
可能出现什么问题?
答案 0 :(得分:6)
如果这不是使用线程,那么我的主要怀疑是某些东西可能正在使用System.Random
类。确保每次调用Next()
时都使用Random类的相同实例。
可能的问题是,如果你快速连续地使用Random
调用方法(即:正常运行,而不是在调试器中),并且每次都创建一个新实例,那么很可能是用相同的种子播种随机实例,因为它基于系统时钟。通过调试“减慢”可以防止这种情况发生,这就是在步进调试会话期间行为会更好的原因。
答案 1 :(得分:3)
你说玩家随意移动的事实意味着你可能会被new Random()
置于循环中的常见错误所困扰。使你的随机对象静止或将其移出循环,你的问题就会消失。