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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:58:34