C# Programming

C#随机数生成:完整指南

Spread the love

C#随机数生成:完整指南

  1. 理解Random
  2. 生成随机整数
  3. 生成随机浮点数
  4. 高效生成多个随机数
  5. 随机数生成器的种子
  6. 密码学安全的随机数
  7. 结论
  8. 常见问题

1. 理解Random

C#的System.Random类是生成伪随机数的主要工具。这些数并非真正的随机数(需要物理熵源),但在大多数应用中,其序列看起来是随机的。它们是由一个初始的种子值确定性地生成的。相同的种子会产生相同的序列,这对于调试很有用,但对于需要真正随机性的应用程序来说,这一点至关重要。

2. 生成随机整数

核心方法是Random.Next()。主要重载方法:

  • Next():返回一个小于int.MaxValue的非负整数。
  • Next(maxValue):返回一个小于maxValue的非负整数(maxValue必须为正数)。
  • Next(minValue, maxValue):返回一个大于等于minValue且小于maxValue的整数(maxValue > minValue)。

示例:


using System;

public class RandomNumberGenerator
{
    public static void Main(string[] args)
    {
        Random random = new Random();

        int randomNumber1 = random.Next(10); // 0 到 9
        Console.WriteLine($"随机数 1: {randomNumber1}");

        int randomNumber2 = random.Next(5, 15); // 5 到 14
        Console.WriteLine($"随机数 2: {randomNumber2}");
    }
}

3. 生成随机浮点数

要生成0.0(包含)到1.0(不包含)之间的随机双精度浮点数,可以使用random.NextDouble()。可以通过缩放和偏移来获得其他范围:


double randomNumber = random.NextDouble() * 100; // 0.0 到 100.0

4. 高效生成多个随机数

当生成许多数字时,重用单个Random实例可以提高效率。快速创建多个实例(使用默认构造函数,由系统时钟播种)可能会导致相似的序列,从而降低表面的随机性。


Random random = new Random();
for (int i = 0; i < 10; i++)
{
    int randomNumber = random.Next(1, 101); // 1 到 100(包含)
    Console.WriteLine($"随机数 {i + 1}: {randomNumber}");
}

5. 随机数生成器的种子

通过向Random构造函数提供种子来控制序列:

  • 可重复性:相同的种子 = 相同的序列(对于测试至关重要)。
  • 特定序列:对于模拟很有用。

Random random1 = new Random(12345);
Console.WriteLine($"种子为 12345 的随机数: {random1.Next(100)}");

Random random2 = new Random(12345);
Console.WriteLine($"种子为 12345 的随机数(再次):{random2.Next(100)}"); // 与上面相同

Random random3 = new Random(); // 使用当前时间作为种子
Console.WriteLine($"使用当前时间作为种子的随机数: {random3.Next(100)}");

6. 密码学安全的随机数

对于安全敏感的应用程序,切勿使用System.Random。请改用System.Security.Cryptography.RandomNumberGenerator

7. 结论

Random类提供简单的伪随机数生成。理解种子和实例重用对于可重复性和效率至关重要。对于安全性,优先使用密码学安全的随机数生成器。

8. 常见问题

问:这些数字是真正随机的吗? 答:不是,是伪随机的。它们看起来是随机的,但实际上是确定性生成的。

问:如何生成随机浮点数? 答:使用random.NextDouble()并根据需要进行缩放/偏移。

问:密码学安全的随机数呢? 答:使用System.Security.Cryptography.RandomNumberGenerator

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注