C# Random
上次修改时间:2025 年 4 月 18 日
本教程探讨如何使用内置的 Random
类在 C# 中生成随机值。
Random
类用作伪随机数生成器,它使用一种算法来生成满足特定统计随机性标准的数字序列。
随机数生成器
随机数生成器 (RNG)生成一个没有明显模式的值序列。 RNG 分为两种类型:硬件随机数生成器和伪随机数生成器。 硬件生成器被认为可以生成真正的随机数,而伪随机生成器则依赖于软件算法来创建看起来是随机的值。 如果算法和初始条件已知,这些伪随机值是确定性的并且可重现。
随机数生成器在赌博、游戏、模拟和密码学等应用中至关重要。
为了提高伪随机数生成器的质量,操作系统会从设备驱动程序、用户输入延迟或硬件组件抖动等来源收集环境噪声。 此数据构成了密码学安全的伪随机数生成器的基础。
种子
种子是初始化随机数生成器的初始值。 随机数生成器通过特定的算法转换先前的值来运行。 一开始,种子为这些操作提供初始值。 随机数生成最具挑战性的方面是选择一个与真正随机性非常接近的种子。
var rnd = new Random();
此构造函数使用默认种子初始化随机数生成器。
Environment.TickCount
更改为 Guid.NewGuid().GetHashCode()
。 此更改确保在循环中创建多个随机实例是安全的。C# 随机数
在以下示例中,我们将演示如何生成各种随机数。
var rand = new Random(); Console.WriteLine(rand.NextDouble()); Console.WriteLine(rand.NextInt64()); var buf = new byte[8]; rand.NextBytes(buf); Console.WriteLine(string.Join(" ", buf));
此示例生成并显示随机双精度浮点数、整数和字节。
var rand = new Random();
实例化 Random
类的新实例。
Console.WriteLine(rand.NextDouble());
NextDouble
方法生成一个介于 0.0(包括)和 1.0(不包括)之间的随机浮点数。
Console.WriteLine(rand.NextInt64());
NextInt64
方法生成一个非负随机 64 位整数。
var buf = new byte[8]; rand.NextBytes(buf);
NextBytes
方法用随机值填充指定的字节数组。
$ dotnet run 0.0746532268944834 7374871010421669053 149 132 170 234 101 204 104 37
C# Random Next
Next
方法生成一个随机整数,可以选择定义生成数字的下限和上限。
有三种重载方法
Next
- 返回一个非负随机整数。Next(Int32)
- 返回一个小于指定最大值的非负随机整数。Next(Int32, Int32)
- 返回指定范围内的随机整数。
var rand = new Random(); Console.WriteLine(rand.Next()); Console.WriteLine(rand.Next(5)); Console.WriteLine(rand.Next(10, 20));
此示例使用不同的 Next
方法重载输出三个随机整数。
$ dotnet run 741804443 3 11
C# 选择随机元素
下一个示例说明如何从集合中选择一个随机元素。
var rand = new Random(); List<int> vals = [1, 2, 3, 4, 5, 6, 7, 8]; var r1 = vals[rand.Next(vals.Count)]; var r2 = vals[rand.Next(vals.Count)]; Console.WriteLine(r1); Console.WriteLine(r2);
此代码从整数列表中随机选择并打印两个元素。 Next
的上限是独占的,可防止范围外异常。
$ dotnet run 5 2
C# 列表洗牌
以下示例演示如何对列表的元素进行洗牌。
var rng = new Random(); List<int> vals = [1, 2, 3, 4, 5, 6]; List<string> words = ["sky", "blue", "war", "toy", "tick"]; Shuffle(vals); Shuffle(words); foreach (var e in vals) { Console.Write($"{e} "); } Console.WriteLine("\n-----------------------"); foreach (var e in words) { Console.Write($"{e} "); } Console.WriteLine(); void Shuffle<T>(IList<T> vals) { int n = vals.Count; while (n > 1) { n--; int k = rng.Next(n + 1); (vals[n], vals[k]) = (vals[k], vals[n]); } }
此示例定义了一个泛型 Shuffle
方法,该方法使用 Fisher-Yates 洗牌算法随机重新排序列表的元素。
$ dotnet run 2 1 3 4 6 5 ----------------------- blue war sky tick toy
C# 随机字符串
以下示例演示如何生成一个随机字符串。
var rand = new Random(); string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; int length = 8; char[] randomString = new char[length]; for (int i = 0; i < length; i++) { randomString[i] = chars[rand.Next(chars.Length)]; } Console.WriteLine(new string(randomString));
此代码通过从预定义的字母数字字符集中选择随机字符来创建一个 8 个字符的随机字符串。
$ dotnet run K7mP9xT2
C# 随机布尔值
下一个示例演示如何生成一个随机布尔值。
var rand = new Random(); bool randomBool = rand.Next(2) == 0; Console.WriteLine(randomBool);
此代码通过生成一个随机整数(0 或 1)并将其转换为布尔值来生成一个随机布尔值。
$ dotnet run True
C# 随机枚举值
以下示例说明如何从枚举中选择一个随机值。
var rand = new Random(); enum Colors { Red, Green, Blue, Yellow } var values = Enum.GetValues(typeof(Colors)); var randomColor = (Colors)values.GetValue(rand.Next(values.Length)); Console.WriteLine(randomColor);
此代码通过检索所有枚举值并随机选择一个值来从 Colors
枚举中随机选择一个值。
$ dotnet run Blue
来源
本教程演示了使用 Random
类在 C# 中生成随机值的各种技术。
作者
列出所有 C# 教程。