C#循环中提升随机数生成的随机性:使用全局唯一标识符
132 浏览量
更新于2024-08-31
收藏 41KB PDF 举报
在C#编程中,特别是在循环中生成随机数时,我们经常需要确保生成的数值序列具有足够的随机性和不可预测性。然而,如果直接使用`Random()`类,由于其默认种子通常依赖于系统当前时间,当在循环中频繁调用时,可能会因为时间戳的微小变化而产生连续相同的随机数,导致生成的随机数序列不随机,而是带有某种规律性。
这是因为在计算过程中,如果种子更新的速度跟不上循环的迭代速度,尤其是对于毫秒级别的时间,可能会出现种子重复,进而导致随机数序列重复。这种现象主要源自于使用基于“线性同余法”的随机数生成器,它依赖于一个固定或可预测的初始值进行迭代。
为了解决这个问题,我们可以采用一个全局唯一的标识符作为随机数生成器的种子。在C#中,可以使用`Guid.NewGuid().GetHashCode()`来获取一个独特的哈希值,因为`Guid`是一个生成的全球唯一标识符,其哈希值的变化范围远大于简单的计时器。通过修改`Random`类的构造函数,使用这个哈希值作为种子,可以显著提高随机数的随机性和独立性。
以下是一段示例代码,展示了如何创建一个静态类`RandomStatic`,其中包含两个方法:`ProduceDblRandom()`用于生成[0,1)区间内的随机小数,`ProduceIntRandom()`用于生成指定范围内的随机整数:
```csharp
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
namespace Calculation
{
public static class RandomStatic
{
// 使用Guid的哈希值生成[0,1)的随机小数
public static double ProduceDblRandom()
{
Random r = new Random(Guid.NewGuid().GetHashCode());
return r.NextDouble();
}
// 生成指定范围内的随机整数
public static int ProduceIntRandom(int minValue, int maxValue)
{
Random r = new Random(Guid.NewGuid().GetHashCode());
return r.Next(minValue, maxValue + 1);
}
}
}
```
在实际应用中,如在按钮点击事件处理程序中使用这个静态类,我们可以看到明显的区别:
```csharp
private void button1_Click_1(object sender, EventArgs e)
{
for (int i = 0; i < 100; i++)
{
Console.WriteLine(RandomStatic.ProduceIntRandom(0, 100));
}
}
// 如果仅使用默认时间种子,可能会有连续相同随机数的问题
private void button2_Click_1(object sender, EventArgs e)
{
Random r = new Random();
for (int i = 0; i < 100; i++)
{
Console.WriteLine(r.Next(0, 100));
}
}
```
通过在C#中使用全局唯一标识符生成的哈希值作为随机数种子,我们可以有效地避免循环中产生伪随机数的问题,从而得到更随机、无规律的随机数序列。这在密码生成、模拟实验或者游戏中,确保数据的多样性至关重要。
2019-04-15 上传
2021-03-16 上传
点击了解资源详情
点击了解资源详情
2018-12-08 上传
2013-01-07 上传
2021-09-16 上传
2012-04-19 上传
2013-03-14 上传
weixin_38638033
- 粉丝: 5
- 资源: 940
最新资源
- sicherheit_ws:安全概念讲习班
- Bregman Cookbook:此工具箱提供基于 Bregman Iterations 的信号/图像/3D 处理-matlab开发
- 下一个大学
- fccWebDesign:在此仓库内,有我为在线课程(在freeCodeCamp上进行的响应式Web设计认证)制作的项目
- dchr.host:端到端K8s CICD练习
- 4ampr-fj2021-paginas-web-semana-03:专业人士
- Accuinsight-1.0.36-py2.py3-none-any.whl.zip
- vicms:用于python-flask的迷你内容管理架构
- Atcoder
- Pure
- irawansyahh.github.io:我的个人网站
- ask:一种在 Node 或浏览器中构建 HTTP 请求的简单、可链接的方式
- Dark Crystals New Tab Game Theme-crx插件
- 库存-REST-API:REST APIのテスト
- JavascriptVerletAlgorithm
- antiwasm:Web程序集objdump