如何在 C# 中生成随机整数:一劳永逸地搞懂
\n随机数生成问题是 Stack Overflow 上最热门的问题之一。看起来很简单,对吧?但实际上,即使是经验丰富的 C# 开发人员也会犯经典错误:每次运行都得到相同的值、遇到非随机序列、或者忘记线程安全问题。今天,我们将一劳永逸地搞清楚如何正确地在 C# 中生成随机整数,并回答 Stack Overflow 热门问题中所有的“为什么”。
\n\n这篇文章是您停止从网上复制代码、开始真正理解 System.Random 内部机制的机会。开始吧!
为什么新手会一次又一次地得到相同的数字?
\n最常见的问题是:“我创建了 Random,但总是得到相同的数字!”。让我们看一个典型的陷阱代码:
\n\n// ❌ 错误示例\nfor (int i = 0; i < 5; i++)\n{\n Random rnd = new Random();\n Console.WriteLine(rnd.Next(1, 100));\n}\n\n\n这段代码会输出什么?99% 的概率是五个相同的数字。为什么?因为 Random 使用系统时钟进行初始化(种子)。当您连续创建多个 Random 实例时,它们会获得相同的“种子”,从而生成相同的序列。
正确的解决方案是 创建一个 Random 实例并重复使用它:
\n\n// ✅ 正确示例\nRandom rnd = new Random();\nfor (int i = 0; i < 5; i++)\n{\n Console.WriteLine(rnd.Next(1, 100));\n}\n\n\n现在每个数字都会不同。简单的规则:每个执行线程一个 Random 实例。
\n\nRandom.Next():获取随机整数的三种方法
\nSystem.Random 类提供了 Next() 方法的三个重载。让我们逐一举例说明:
1. Random.Next() — 无参数
\n返回一个范围在 0 到 Int32.MaxValue - 1 之间的非负整数。即 0 到 2,147,483,646。
Random rnd = new Random();\nint anyNumber = rnd.Next();\nConsole.WriteLine(anyNumber); // 例如:1789034215\n\n\n2. Random.Next(Int32) — 带上限
\n返回一个从 0(包含)到指定最大值(不包含)之间的数字。
\nint dice = rnd.Next(7); // 0, 1, 2, 3, 4, 5 或 6\nConsole.WriteLine(dice);\n\n\n3. Random.Next(Int32, Int32) — 范围 [min, max)
\n这是 C# 生成随机整数 在指定范围内最常用的选项。
\n// 从 1 到 100 的随机数(包含 1 和 100)\nint score = rnd.Next(1, 101);\nConsole.WriteLine(score);\n\n\n重要提示:上限 不包含。要获得 1 到 6 的数字(如骰子),请写 Next(1, 7)。
C# 中使用 Random 的三大常见错误
\n基于 Stack Overflow C# random 上的真实问题,我们总结出最常见的陷阱:
\n\n- \n
- 错误 #1:在循环中创建新的 Random 实例。 我们已经讨论过——这会导致相同的数字。解决方案:将
new Random()移到循环外部。 \n - 错误 #2:Random 不是线程安全的。 如果多个线程在没有同步的情况下使用同一个
Random实例,可能会导致故障和零值。请使用lock或ThreadLocal<Random>。 \n - 错误 #3:将 Random 用于密码或令牌。
System.Random是一个伪随机生成器。它是可预测的!为了安全,需要使用System.Security.Cryptography.RandomNumberGenerator。 \n