目录
一、基本介绍
二、种子(Seed)的作用
三、基本模板
四、基本用法:生成随机数
五、代码示例
六、注意事项
七、常见方法对比
一、基本介绍
原理:基于种子值(默认以系统时间为种子)生成伪随机序列,相同种子会产生相同序列。
适用场景:游戏随机事件、抽样测试、模拟数据生成等
二、种子(Seed)的作用
默认行为
若未指定种子,Random会使用当前系统时间(毫秒级)作为种子,确保每次运行生成不同序列。
指定种子
若需生成可重复的随机序列(如测试场景),可手动传入种子:
Random randomWithSeed = new Random(123);// 种子为123,每次运行生成相同的随机数序列
三、基本模板
// 1. 实例化Random(建议全局唯一,避免重复创建)
Random random = new Random();
// 2. 生成随机数(调用不同方法)
int num1 = random.Next();// 非负整数(0 ~ int.MaxValue)
int num2 = random.Next(100);// 0 ~ 99(左闭右开区间)
int num3 = random.Next(50, 100);// 50 ~ 99
double num4 = random.NextDouble();// 0.0 ~ 1.0的双精度浮点数
四、基本用法:生成随机数
1.实例化Random对象
Random random = new Random();// 默认以系统时间作为种子(Seed)
2.生成整数
int randomInt = random.Next(10);// 结果:0-9之间的整数
3.生成浮点数
double randomDouble = random.NextDouble();// 结果:0.0 ≤ x < 1.0
五、代码示例
1.生成指定范围的整数
Random rnd = new Random();
int diceRoll = rnd.Next(1, 7);// 生成1~6的整数(模拟骰子)
Console.WriteLine($"骰子点数:{diceRoll}");
2.生成随机浮点数
Random rnd = new Random();
double randomValue = rnd.NextDouble() * 100;// 0.0 ~ 100.0
Console.WriteLine($"随机浮点数:{randomValue:F2}");// 保留两位小数
3.生成不重复的随机数
//生成10个1~100的不重复数
List<int> numbers = newList<int>(); //List可以指定类型进行存储,且存储一种数据类型,取出时不用强制转换,能保证数据类型安全
while (numbers.Count < 10)
{
int num = rnd.Next(1, 101);
if (!numbers.Contains(num))
numbers.Add(num);
}
Console.WriteLine("不重复随机数:" + string.Join(", ", numbers));
六、注意事项
1.避免短时间内重复实例化
若在循环中频繁创建Random对象(如毫秒内多次实例化),系统时间种子可能相同,导致生成重复的随机数。建议全局或类级别的单例实例。
2.种子的可控性
若需复现随机结果,可指定种子:
Random random = new Random(123); // 固定种子123,每次运行生成相同序列
3.加密安全场景
若用于密码等敏感场景,需使用加密级随机数生成器
4.多线程安全
Random类不是线程安全的,多线程环境下需加锁或使用ThreadLocal<Random>
七、常见方法对比
| 方法 | 描述 | 示例 |
| Next() | 生成非负整数(0 ~ int.MaxValue) | random.Next()→ 123456 |
| Next(int maxValue) | 生成0 ~ maxValue-1的整数 | random.Next(10)→ 3 |
| Next(int min, int max) | 生成min ~ max-1的整数 | random.Next(5, 10)→ 7 |
| NextDouble() | 生成0.0 ~ 1.0的双精度浮点数 | random.NextDouble()→ 0.456 |
| NextBytes(byte[] buffer) | 填充随机字节到数组 | random.NextBytes(buffer) |