为何调用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
相关产品推荐
相关产品推荐

