C#随机数生成异常:输入不同iLvl始终返回5-8区间值求助
嘿,我一眼就看到问题啦!你遇到的所有输入都只生成5-8随机数的情况,核心问题出在条件判断的逻辑运算符用错了,另外还有Random实例化的小优化点,咱们一步步拆解来看:
1. 条件判断的致命错误:用了||而非&&
你看代码里的这些区间判断:
if (iLvl >= 1 || iLvl <= 4) // tier 8
这里的||是逻辑或运算符,意思是只要满足两个条件中的任意一个就会进入分支。但对于1-100之间的任何iLvl来说,所有数都满足iLvl >=1或者iLvl <=4——比如输入5,它满足iLvl >=1;输入100,也满足iLvl >=1。所以不管你输入什么数值,第一个条件永远为真,程序只会执行preRoll = obj.Next(5, 9);,自然只会得到5-8的随机数。
解决方法超简单:把所有条件里的||改成&&,这样才是判断iLvl同时落在区间范围内的正确逻辑:
if (iLvl >= 1 && iLvl <= 4) // tier 8 else if (iLvl >= 5 && iLvl <= 10) // tier 7 // ... 其他所有区间判断都替换成&&
2. Random实例化的优化问题
你已经定义了一个静态的getrandom实例,还写了线程安全的GenRan方法,但在点击事件里又新建了一个Random obj,这不仅没必要,还可能导致快速点击按钮时生成重复的随机数(因为Random默认用系统时钟做种子,短时间内多次实例化会得到相同的种子)。
建议直接复用你已经写好的GenRan方法,替换掉obj.Next的调用:
preRoll = GenRan(5, 9); // 代替 obj.Next(5,9)
这样既保证了线程安全,又避免了重复实例化的问题。
修正后的核心代码片段
把这两个问题修复后,再加上输入合法性判断(避免非数字输入崩溃),你的点击事件核心部分应该是这样的:
private void selButt_Click(object sender, EventArgs e) { int iLvl = 0; int preRoll = 0; // 先判断输入是否为有效数字 if (!int.TryParse(itemLvl.Text, out iLvl)) { MessageBox.Show("请输入有效的数字!"); return; } // 判断是否在1-100范围内 if (iLvl < 1 || iLvl > 100) { MessageBox.Show("Item Level incorrect! "); return; } if (ringType.SelectedIndex == 0) { ringpic.Load("E:\\ProgProj\\POERingMaker Alpha 1.0\\POERingMaker Alpha 1.0\\Resources\\Steel_Ring.png"); if (iLvl >= 1 && iLvl <= 4) // tier 8 { preRoll = GenRan(5, 9); } else if (iLvl >= 5 && iLvl <= 10) // tier 7 { preRoll = GenRan(10, 19); } else if (iLvl >= 11 && iLvl <= 17) // tier 6 { preRoll = GenRan(20, 29); } else if (iLvl >= 18 && iLvl <= 23) // tier 5 { preRoll = GenRan(30, 39); } else if (iLvl >= 24 && iLvl <= 29) // tier 4 { preRoll = GenRan(40, 49); } else if (iLvl >= 30 && iLvl <= 35) // tier 3 { preRoll = GenRan(50, 59); } else if (iLvl >= 36 && iLvl <= 43) // tier 2 { preRoll = GenRan(60, 69); } else if (iLvl >= 44 && iLvl <= 100) // tier 1 { preRoll = GenRan(70, 79); } prefixBox.Text = preRoll.ToString(); } // ... 其他ringType分支保持不变 }
现在你再测试一下,输入不同的iLvl应该就能对应到正确的区间生成随机数啦!
内容的提问来源于stack exchange,提问作者Anirudh
相关产品推荐
相关产品推荐

