ZetCode

C# Random

上次修改时间:2025 年 4 月 18 日

本教程探讨如何使用内置的 Random 类在 C# 中生成随机值。

Random 类用作伪随机数生成器,它使用一种算法来生成满足特定统计随机性标准的数字序列。

随机数生成器

随机数生成器 (RNG)生成一个没有明显模式的值序列。 RNG 分为两种类型:硬件随机数生成器和伪随机数生成器。 硬件生成器被认为可以生成真正的随机数,而伪随机生成器则依赖于软件算法来创建看起来是随机的值。 如果算法和初始条件已知,这些伪随机值是确定性的并且可重现。

随机数生成器在赌博、游戏、模拟和密码学等应用中至关重要。

注意:对于安全敏感型应用程序,需要使用密码学安全的伪随机数生成器。

为了提高伪随机数生成器的质量,操作系统会从设备驱动程序、用户输入延迟或硬件组件抖动等来源收集环境噪声。 此数据构成了密码学安全的伪随机数生成器的基础。

种子

种子是初始化随机数生成器的初始值。 随机数生成器通过特定的算法转换先前的值来运行。 一开始,种子为这些操作提供初始值。 随机数生成最具挑战性的方面是选择一个与真正随机性非常接近的种子。

var rnd = new Random();

此构造函数使用默认种子初始化随机数生成器。

注意:自 2016 年以来,在 .NET Core 中,默认种子已从 Environment.TickCount 更改为 Guid.NewGuid().GetHashCode()。 此更改确保在循环中创建多个随机实例是安全的。

C# 随机数

在以下示例中,我们将演示如何生成各种随机数。

Program.cs
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 方法生成一个随机整数,可以选择定义生成数字的下限和上限。

有三种重载方法

Program.cs
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# 选择随机元素

下一个示例说明如何从集合中选择一个随机元素。

Program.cs
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# 列表洗牌

以下示例演示如何对列表的元素进行洗牌。

Program.cs
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# 随机字符串

以下示例演示如何生成一个随机字符串。

Program.cs
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# 随机布尔值

下一个示例演示如何生成一个随机布尔值。

Program.cs
var rand = new Random();

bool randomBool = rand.Next(2) == 0;

Console.WriteLine(randomBool);

此代码通过生成一个随机整数(0 或 1)并将其转换为布尔值来生成一个随机布尔值。

$ dotnet run
True

C# 随机枚举值

以下示例说明如何从枚举中选择一个随机值。

Program.cs
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 类 - 语言参考

本教程演示了使用 Random 类在 C# 中生成随机值的各种技术。

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。 我自 2007 年以来一直在撰写编程文章。 迄今为止,我已经撰写了超过 1,400 篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 C# 教程