C#随机数生成全攻略
·
一、Random 类(伪随机数)
基本用法
csharp
Random rnd = new Random(200); // 指定种子 // 或不指定种子(默认使用当前时间作为种子) Random rnd = new Random();
常用方法
-
Next()- 返回非负随机整数 -
Next(maxValue)- 返回小于指定最大值的非负随机整数(0到maxValue-1) -
Next(minValue, maxValue)- 返回指定范围内的随机整数 -
NextDouble()- 返回0.0到1.0之间的随机浮点数
注意事项
csharp
// 错误用法:在循环内重复创建 Random 对象
for (int i = 0; i < 10; i++)
{
Random r1 = new Random(); // for执行太快,种子相同
Console.WriteLine(r1.Next());
}
// 正确用法:在循环外创建一次
Random r2 = new Random();
for (int i = 0; i < 10; i++)
{
Console.WriteLine(r2.Next());
}
二、格式化随机小数
csharp
double a1 = rnd.NextDouble();
Console.WriteLine(Math.Round(a1, 3)); // 四舍五入保留3位
Console.WriteLine(a1.ToString("F3")); // 格式化为3位小数
三、GUID(全局唯一标识符)
csharp
Guid.NewGuid(); // 生成格式:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
-
特点:基于系统时间、硬件ID等计算的128位随机数
-
用途:产品密钥、订单号、唯一标识
-
优点:全球唯一性
四、RNGCryptoServiceProvider(加密安全的随机数)
csharp
RNGCryptoServiceProvider csp = new RNGCryptoServiceProvider(); byte[] bs = new byte[10]; // 创建字节数组 csp.GetBytes(bs); // 填充随机字节 Console.WriteLine(BitConverter.ToString(bs)); // 转换为16进制字符串
-
输出格式:64-D4-78-CP-2E-67-5E-CC-E6-08
-
特点:真随机、不可预测、安全性高
-
用途:密码学、安全令牌、密钥生成
五、方法对比总结
| 方法 | 类型 | 安全性 | 性能 | 适用场景 |
|---|---|---|---|---|
| Random 类 | 伪随机 | 低 | 高 | 游戏、模拟、测试数据 |
| GUID | 唯一标识 | 中 | 中 | 唯一标识、订单号 |
| RNGCryptoServiceProvider | 真随机 | 高 | 较低 | 密码学、安全令牌 |
六、最佳实践建议
-
一般用途:使用
Random类(注意单例使用) -
需要唯一性:使用
Guid.NewGuid() -
安全敏感:使用
RNGCryptoServiceProvider -
格式化小数:使用
ToString("F")或Math.Round()
关键点总结
-
Random 是伪随机,种子相同则序列相同
-
循环内不要重复创建 Random 对象
-
GUID 不保证随机性,但保证唯一性
-
加密场景必须使用 RNGCryptoServiceProvider
-
根据需求选择合适的方法
更多推荐


所有评论(0)