C#中If语句与Random类异常问题求助
解决你的决斗者模拟程序bug
嘿,Bradley!刚学C#就动手写这种概率模拟程序,已经超厉害了~你遇到的这个“某个决斗者包揽全部10k次胜利”的问题,大概率和Random的使用方式有关,也可能是状态重置的逻辑漏了,我给你拆解下:
最可能的问题:Random实例重复创建
C#里的Random类默认用系统当前时间作为种子,如果你在每次需要生成随机数的时候都new一个Random对象,比如在射击方法里每次都var rnd = new Random();,那短时间内多次创建的Random会拿到相同的种子,生成完全一样的随机序列。结果就是每一轮决斗的命中情况都一模一样,自然同一个决斗者一直赢。
解决办法:用全局唯一的Random实例
整个模拟过程只创建一次Random,所有需要随机数的地方都复用它。比如:
// 在类里声明一个全局的Random实例 private static Random _globalRandom = new Random(); // 判断是否命中的方法,复用这个实例 private bool DidHit(double accuracy) { // NextDouble()生成0到1之间的随机数,和命中率比较 return _globalRandom.NextDouble() < accuracy; }
另一个可能:决斗者状态没重置
如果每一轮决斗结束后,你没有把三个决斗者的存活状态重置为初始值(比如都设为活着),那下一轮决斗会直接沿用之前的结果——比如第一轮决斗后Duelist1赢了,后面9999轮里另外两个决斗者还是死的,自然Duelist1一直获胜。
解决办法:每轮模拟前重置状态
在10k次循环的开头,重置所有决斗者的存活标记:
// 假设你有三个决斗者对象,每个有IsAlive属性 int duelist1Wins = 0, duelist2Wins = 0, duelist3Wins = 0; for (int round = 0; round < 10000; round++) { // 每轮开始前重置所有人生还状态 duelist1.IsAlive = true; duelist2.IsAlive = true; duelist3.IsAlive = true; // 开始本轮决斗循环,直到只剩一个人活着 while (CountAliveDuelists() > 1) { // 按预设顺序轮流射击的逻辑 ShootIfAlive(duelist1, duelist2, duelist3); ShootIfAlive(duelist2, duelist1, duelist3); ShootIfAlive(duelist3, duelist1, duelist2); } // 统计本轮获胜者 if (duelist1.IsAlive) duelist1Wins++; else if (duelist2.IsAlive) duelist2Wins++; else duelist3Wins++; } // 辅助方法:统计存活的决斗者数量 private int CountAliveDuelists() { int count = 0; if (duelist1.IsAlive) count++; if (duelist2.IsAlive) count++; if (duelist3.IsAlive) count++; return count; }
额外排查小技巧
把模拟次数改成10次,然后在每一轮打印详细过程(比如谁在射击、是否命中、当前存活状态),这样你就能直观看到是不是每一轮的流程都完全一样,或者状态没重置的问题。
内容的提问来源于stack exchange,提问作者Bradley99
相关产品推荐
相关产品推荐

