简介
Random 是 .NET 中 System 命名空间提供的一个类,用于生成伪随机数。它广泛应用于需要随机化操作的场景,如生成随机数据、模拟、游戏开发或测试用例生成。
- 伪随机数生成
 
在计算机中,Random 类用于生成伪随机数,这些数值在一定程度上看起来是随机的,但它们实际上是通过数学公式从一个初始种子值计算得到的,因此称之为"伪随机数"。
- 广泛应用
 
Random 类常用于游戏开发、模拟、加密等场景。在许多应用中,生成随机数或随机选择某个元素是常见的需求。
- 注意:
 
Random 类并不适合用于需要高强度安全性的随机数生成(如加密操作)。对于加密或安全性要求较高的场景,应使用 System.Security.Cryptography.RandomNumberGenerator。
核心功能
- 
生成整数随机数
- 随机生成一个范围内的整数。
 
 - 
生成浮点数随机数
- 随机生成一个浮点数,通常是 
[0, 1)范围内。 
 - 随机生成一个浮点数,通常是 
 - 
生成布尔值随机数
- 随机生成 
true或false。 
 - 随机生成 
 - 
种子控制
- 可以指定种子值以控制随机数生成序列,确保同一种子值生成的随机数序列相同,适用于测试场景。
 
 
常用方法
构造函数
            
            
              csharp
              
              
            
          
          Random random = new Random();        // 使用系统时间作为种子生成随机数
Random seededRandom = new Random(123);  // 使用指定的种子值
        - 
new Random():默认构造函数会基于系统时间生成一个种子,从而生成伪随机数。 - 
new Random(int seed):通过指定的种子值创建Random实例。种子值相同会生成相同的随机序列。 
Next 方法
Next() 方法用于生成随机整数。
Next():生成一个大于或等于 0 且小于Int32.MaxValue的整数。
            
            
              csharp
              
              
            
          
          int randomInt = random.Next();
Console.WriteLine(randomInt);  // 输出一个随机整数
        Next(int maxValue):生成一个大于或等于 0 且小于maxValue的整数。
            
            
              csharp
              
              
            
          
          int randomInt = random.Next(10);  // 生成 [0, 10) 范围内的整数
Console.WriteLine(randomInt);
        Next(int minValue, int maxValue):生成一个大于或等于minValue且小于maxValue的整数。
            
            
              csharp
              
              
            
          
          int randomInt = random.Next(5, 15);  // 生成 [5, 15) 范围内的整数
Console.WriteLine(randomInt);
        NextDouble 方法
生成一个 [0.0, 1.0) 范围内的随机浮点数。
            
            
              csharp
              
              
            
          
          double randomDouble = random.NextDouble();
Console.WriteLine(randomDouble);  // 输出 [0.0, 1.0) 范围内的随机浮点数
        NextBytes 方法
填充指定的字节数组,生成随机字节。
            
            
              csharp
              
              
            
          
          byte[] buffer = new byte[10];  // 创建一个长度为 10 的字节数组
random.NextBytes(buffer);      // 填充随机字节
Console.WriteLine(string.Join(", ", buffer));  // 输出随机字节数组
        NextBoolean(自定义扩展)
Random 类本身没有直接提供 NextBoolean 方法,但可以通过 Next() 或 NextDouble() 自行实现:
            
            
              csharp
              
              
            
          
          public static bool NextBoolean(this Random random)
{
    return random.Next(2) == 0;  // 随机返回 true 或 false
}
        性能与线程安全
- 线程安全问题
 
Random 类本身 不是线程安全 的,在多线程环境中,如果多个线程共享同一个 Random 实例,可能会导致重复的随机数序列。解决办法有两种:
- 
使用 独立的
Random实例 每个线程一个。 - 
使用 线程本地存储 (
ThreadLocal<T>) 或通过Random.Shared提供共享实例。 
- 性能优化
 
- 
创建多个
Random实例(每个线程一个)比在单一实例上使用锁(lock)性能更优。 - 
如果需要生成大量的随机数,避免频繁地创建
Random实例,可以复用Random对象。 
常见使用场景
- 
模拟与建模 在模拟游戏、数据科学、蒙特卡洛模拟等应用中,需要生成随机数来模拟系统或进行实验。
 - 
随机数据生成 用于生成随机密码、验证码、随机名称等。
 - 
游戏开发 随机生成敌人位置、道具掉落、随机事件等。
 - 
测试与调试 在单元测试和调试过程中,使用随机数生成器生成假数据来模拟各种场景。
 - 
随机排序 可以用于随机打乱列表、数组中的元素,如通过
OrderBy方法打乱列表: 
            
            
              csharp
              
              
            
          
          var shuffledList = list.OrderBy(x => random.Next()).ToList();
        使用示例
示例 1:生成指定范围的随机整数
            
            
              csharp
              
              
            
          
          Random random = new Random();
int randomInt = random.Next(1, 100);  // 生成 1 到 100 之间的整数
Console.WriteLine(randomInt);
        示例 2:生成随机布尔值
            
            
              csharp
              
              
            
          
          Random random = new Random();
bool randomBool = random.Next(2) == 0;  // 随机生成 true 或 false
Console.WriteLine(randomBool);
        示例 3:生成随机数组
            
            
              csharp
              
              
            
          
          Random random = new Random();
byte[] bytes = new byte[10];
random.NextBytes(bytes);  // 填充随机字节
Console.WriteLine(string.Join(", ", bytes));
        示例 4:生成随机浮点数
            
            
              csharp
              
              
            
          
          Random random = new Random();
double randomDouble = random.NextDouble();  // 生成 [0.0, 1.0) 范围内的随机浮点数
Console.WriteLine(randomDouble);
        示例 5:线程安全的随机数生成
            
            
              csharp
              
              
            
          
          // 使用 ThreadLocal 来确保每个线程都有自己的 Random 实例
ThreadLocal<Random> threadRandom = new ThreadLocal<Random>(() => new Random());
int randomInt = threadRandom.Value.Next(1, 100);  // 每个线程都有独立的随机数生成器
Console.WriteLine(randomInt);
        与其他工具的对比
与 RandomNumberGenerator
- 
RandomNumberGenerator(System.Security.Cryptography):- 
提供加密安全的真随机数,基于操作系统熵源。
 - 
性能较低(约 100 ns vs
Random的 10 ns)。 - 
适合加密场景(如密钥、令牌)。
 
 - 
 - 
Random:
- 
伪随机,性能高,适合非安全场景。
 - 
不适合加密用途。
 
 - 
 
与 Random.Shared (.NET 7+)
- 
Random.Shared:- 
NET 7+提供的线程安全单例。 - 
内部使用锁确保并发安全,适合简单多线程场景。
 - 
示例:
 
csharpint number = Random.Shared.Next(1, 100); // 线程安全 - 
 - 
Random:- 
需手动管理线程安全。
 - 
适合单线程或需要控制种子的场景。
 
 - 
 
总结
Random 类是 C# 中最常用的伪随机数生成工具,具有简单、高效、易用的特点。适用于从生成随机数到模拟数据、游戏开发、随机排序等多种场景。通过正确使用 Random 类的功能和线程安全注意事项,可以确保在性能和可靠性上获得最佳结果。在安全性要求较高的场景下,应该使用更为安全的 RandomNumberGenerator。
资源和文档
- 
官方文档:
- 
Microsoft Learn:learn.microsoft.com/en-us/dotne... - 
.NET 7新功能:learn.microsoft.com/en-us/dotne... 
 -