You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:53:32