首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重复单步调试≠运行调试

重复单步调试≠运行调试
EN

Stack Overflow用户
提问于 2011-11-25 02:44:18
回答 2查看 462关注 0票数 2

我在Visual Studio2010旗舰版中使用C#和XNA。

我有一个程序,它执行一些不涉及计时、线程或任何其他可能影响结果的计算,如果我停止执行以进行调试,但在继续运行程序的其余部分之前没有做任何事情。

最后,程序会将一些输出打印到屏幕上。

在此程序中,重复按F10直到显示输出,所产生的结果与仅按F5在调试时运行或不调试时运行所产生的结果不同,这两种情况都会产生错误的结果。

这显示了具有单个F10步骤的运行。

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

下图显示了使用F5运行的情况。

有些东西不在这里,游戏运行不会相互影响,设置只是停止和开始计数的地方,它们不会影响任何东西。然而,与第一张图片非常不同的是,我们连续赢得了所有100场比赛,两次,但随后又连续两盘输掉了100场全新的无关游戏。

给出第二张图片的明显答案是,我的程序逻辑有问题,但实际上并没有问题。当我去调试问题时,运行调试器的速度很慢,这样我就可以看到发生了什么事情来修复它,这让人沮丧。

会出什么问题呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-25 02:49:30

如果这不是在使用线程,那么我的主要怀疑是可能有什么东西在使用System.Random类。确保对Next()的每次调用都使用Random类的相同实例。

可能的问题是,如果您使用Random快速连续调用一个方法(即:在正常运行时,而不是在调试器中),并且每次都创建一个新实例,那么您很可能会用相同的种子来播种随机实例,因为它是基于系统时钟的。通过调试“减慢它”可以防止这种情况发生,这就是为什么在单步调试会话期间行为会更好。

票数 6
EN

Stack Overflow用户

发布于 2011-11-25 02:49:29

你说玩家的移动是随机的,这意味着你很可能会被常见的将new Random()放入循环中的错误所困扰。让你的随机对象成为静态的,或者把它移出循环,你的问题就会消失。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8261386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档