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

为何调用GenerateLotteryNumber方法五次返回相同的5个随机数?

为什么调用五次GenerateLotteryNumber会返回相同数字?

问题根源在于GenerateLotteryNumber方法内部每次调用都新建Random实例。Random默认依赖系统当前时钟作为生成随机数的种子,短时间内连续创建多个Random对象时,系统时钟还没产生变化,导致所有实例使用完全相同的种子,最终生成重复的随机数。

修复方案

把Random实例改为Lottery类的成员变量,只初始化一次,后续调用方法时复用这个实例即可生成不同的随机数。

修改后的Lottery类

public class Lottery
{
    // 将Random作为类的私有字段,仅初始化一次
    private Random rnd = new Random();

    public int GenerateLotteryNumber()
    {
        // 复用已有的Random实例生成随机数
        return rnd.Next(1, 41);
    }
}

优化后的调用代码(可选)

直接字符串拼接在循环里效率较低,建议用StringBuilder来构建结果:

Lottery myLottery = new Lottery();
StringBuilder resultBuilder = new StringBuilder();

// 添加第一个数字
resultBuilder.Append(myLottery.GenerateLotteryNumber().ToString());

// 添加剩下的4个数字
for (int i = 0; i < 4; i++)
{
    resultBuilder.Append(", " + myLottery.GenerateLotteryNumber().ToString());
}

txtLotteryNumbers.Text = resultBuilder.ToString();

额外说明

如果你的Lottery类会被多个实例同时使用,可将Random设为静态字段,但要注意多线程场景下需要加锁保证线程安全(单线程场景无需考虑):

public class Lottery
{
    private static Random rnd = new Random();
    private static readonly object lockObj = new object();

    public int GenerateLotteryNumber()
    {
        lock (lockObj)
        {
            return rnd.Next(1, 41);
        }
    }
}

内容的提问来源于stack exchange,提问作者nicomp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 00:42:46