随机分配bool值异常求助:仅MessageBox启用时功能正常
问题根源与解决方案
嘿,这个问题我太熟了!你碰到的是Random类的经典坑,咱们一步步拆解清楚:
为什么会出现全true或全false的情况?
问题出在你每次调用doesPersonJoin()时都新建了一个Random实例。Random默认用当前系统时钟的毫秒数作为种子来生成随机序列,但你的for循环运行速度极快,5次调用几乎在同一毫秒内完成——这就导致这几个Random实例的种子完全相同,生成的随机数自然也一模一样,最终结果要么全true要么全false。
至于弹MessageBox就正常的原因?很简单,弹窗会让程序暂停,时间足够流逝,每次新建Random时种子不一样,生成的随机数也就有差异了。
两种快速修复方案
方案1:将Random作为类成员变量复用
把Random实例移到方法外面,让整个循环都用同一个实例生成随机数:
// 在你的类中定义一个全局的Random实例 private Random rnd = new Random(); public bool doesPersonJoin() { bool joinBool = true; int r = rnd.Next(1, 100); if (r > 50) { joinBool = false; } return joinBool; }
方案2:将Random作为参数传入方法
提前在循环外创建Random实例,再传给方法使用:
// 循环外初始化Random Random rnd = new Random(); for (int i = 0; i < 5; i++) { person[i].participate = doesPersonJoin(rnd); } public bool doesPersonJoin(Random rnd) { bool joinBool = true; int r = rnd.Next(1, 100); if (r > 50) { joinBool = false; } return joinBool; }
小优化:简化判断逻辑
其实你可以把doesPersonJoin的代码简化得更简洁:
public bool doesPersonJoin() { return rnd.Next(1, 100) <= 50; }
内容的提问来源于stack exchange,提问作者Ken Smith
相关产品推荐
相关产品推荐

