C#代码执行始终返回0问题求助:随机数赋值逻辑排查
问题排查与修复
你遇到的核心问题是Nummer1始终返回0,本质是**bepaal()方法从未被正确触发执行**,导致三个_nummer字段一直保持默认值0。以下是具体问题点和修复方案:
问题1:bepaal()方法触发逻辑错误
你的Punten属性setter中绑定了bepaal(),但按钮点击事件里完全没有操作Punten属性,导致bepaal()从未执行,三个_nummer自然还是默认的0值。
问题2:bepaal()判定逻辑冗余且不完整
多个if条件重复判断“三个数相等”的情况,完全冗余;同时未处理“没有相同数字”的场景,_punten会一直保持默认0。
问题3:Random实例化位置不合理
每次调用bepaal()都新建Random实例,短时间内多次调用会因系统时钟种子问题生成重复随机数,应该将Random作为类成员只实例化一次。
修复后的代码
修正后的Spel类
class Spel { // 将Random改为类私有成员,仅实例化一次 private readonly Random _rnd = new Random(); private int _nummer1; public int Nummer1 { get { return _nummer1; } set { _nummer1 = value; } } private int _nummer2; public int Nummer2 { get { return _nummer2; } set { _nummer2 = value; } } private int _nummer3; public int Nummer3 { get { return _nummer3; } set { _nummer3 = value; } } private int _punten; public int Punten { get { return _punten; } set { _punten = value; } } // 新增公共方法,主动触发随机数生成与分数计算 public void GenereerNummersEnBepaalPunten() { _nummer1 = _rnd.Next(1, 4); _nummer2 = _rnd.Next(1, 4); _nummer3 = _rnd.Next(1, 4); // 简化判定逻辑 if (_nummer1 == _nummer2 && _nummer2 == _nummer3) { _punten = 10; } else if (_nummer1 == _nummer2 || _nummer1 == _nummer3 || _nummer2 == _nummer3) { _punten = 5; } else { _punten = 0; // 明确无匹配时的分数 } } }
修正后的Controller类
public class Controller { private Spel spl = new Spel(); public int GetNummer1() { return spl.Nummer1; } // 添加触发随机数生成的方法 public void StartNieuwRonde() { spl.GenereerNummersEnBepaalPunten(); } }
修正后的按钮点击事件
private void button1_Click(object sender, EventArgs e) { teller++; // 先生成随机数,再获取数值 spl.StartNieuwRonde(); label1.Text = spl.GetNummer1().ToString(); // 可按需扩展获取其他数值 // label2.Text = spl.Nummer2.ToString(); // label3.Text = spl.Nummer3.ToString(); // labelPunten.Text = spl.Punten.ToString(); }
关键修复点总结
- 新增
GenereerNummersEnBepaalPunten()公共方法,主动触发随机数生成与分数计算,不再依赖Punten属性的setter。 - 将
Random改为类成员,避免短时间重复调用生成相同随机数。 - 简化分数判定逻辑,去掉冗余条件,补充无匹配场景的分数处理。
- 按钮点击时先调用生成方法,再获取数值,确保拿到最新的随机数。
内容的提问来源于stack exchange,提问作者Tuur
相关产品推荐
相关产品推荐

