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

随机分配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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 12:32:46