博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
.Net使用system.Security.Cryptography.RNGCryptoServiceProvider类与System.Random类生成随机数
阅读量:6901 次
发布时间:2019-06-27

本文共 1910 字,大约阅读时间需要 6 分钟。

.Net中我们通常使用Random类生成随机数,在一些场景下,我却发现Random生成的随机数并不可靠,在下面的例子中我们通过循环随机生成10个随机数:

for (int i = 0; i < 10; i++)            {                Random random1 = new Random();                Console.WriteLine(random1.Next());            }

测试生成随时基本都是相同的结果:

很显然上面的结果是不靠谱的,为什么会这样呢,因为微软的Random类,发现在C#中生成随机数使用的算法是线性同余法,这种算法生成的不是绝对随机,而是一种伪随机数,线性同余法算法的的公式是

:第n+1个数 = ( 第N个数 * a + b) % m ,公式中a、b和m分别为常数,是生成随机数的因子,如果之前从未通过同一个Random对象生成过随机数(也就是调用过Next方法),那么第N个随机数为将被指定为一个默认的常数,这个常数在创建一个Random类时被默认值指定,Random也提供一个构造函数允许开发者使用自己的随机数因子.

有人说要将 Random random1 = new Random(); 要放到循环的外面:

Random random2 = new Random();            for (int i = 0; i < 20; i++)            {                Console.WriteLine(random2.Next());            }

测试上面的代码执行的结果是这样的:

得到结果还是不靠谱的

有人说使用GUID产生填充因子:

for (int i = 0; i < 20; i++)            {                byte[] buffer = Guid.NewGuid().ToByteArray();                int iSeed = BitConverter.ToInt32(buffer, 0);                Random random3 = new Random(iSeed);                Console.WriteLine(random3.Next());            }

测试上面的代码得到的结果:

得到的结果还是不靠谱的。

为了生成更加可靠的随机数,微软在System.Security.Cryptography命名空间下提供一个名为system.Security.Cryptography.RNGCryptoServiceProvider的类,它采用系统当前的硬件信息、进程信息、线程信息、系统启动时间和当前精确时间作为填充因子,通过更好的算法生成高质量的随机数,它的使用方法如下所示:

for (int i = 0; i < 20; i++)            {                byte[] randomBytes = new byte[8];                System.Security.Cryptography.RNGCryptoServiceProvider rngServiceProvider = new System.Security.Cryptography.RNGCryptoServiceProvider();                rngServiceProvider.GetBytes(randomBytes);                int result = BitConverter.ToInt32(randomBytes, 0);                result = System.Math.Abs(result);  //求绝对值                Console.WriteLine(result);            }

测试结果未发现重复的:

 

总结:

Random算法简单,性能较高,适用于随机性要求不高的情况,由于RNGCryptoServiceProvider在生成期间需要查询上面提到的几种系统因子,所以性能稍弱于Random类,但随机数质量高,可靠性更好。使用哪一种方式视情况而定

转载于:https://www.cnblogs.com/linJie1930906722/p/6115917.html

你可能感兴趣的文章
快速atof()函数
查看>>
Starting an Interactive Client Process in C++
查看>>
MSSQL-应用案例-日志表设计优化与实现
查看>>
中国移动应该怎样看待云计算
查看>>
网络安全人才平均月薪近万 这五个城市需求最大
查看>>
云安全风险不再是最令人担心的问题?
查看>>
怎样正确地测试和维护防火墙?
查看>>
打造智能城市 要先撑起一张智能接入的全覆盖大网
查看>>
VMware通过统一端点管理、Windows 10支持与加强身份管理为数字工作空间提供创新...
查看>>
企业信息化“五段论”
查看>>
Verizon报告:2020年IoT平台市场规模将达16亿美元
查看>>
社区的成长才是我们的价值所在 - 阿里云全球第二批 MVP 祁宁专访
查看>>
php在网站根目录下写文件
查看>>
英特尔京东云强强联合 服务互联网+转型升级
查看>>
网络安全靠大家
查看>>
构建生态企业 打造移动化无限可能
查看>>
绝非玩笑!人工智能或开创黑客新时代
查看>>
除了密钥,公有云还有哪些安全保护方式?
查看>>
安全防护重在数据 人才选拔重在心力、脑力、体力
查看>>
SD-WAN提供安全的云服务接入
查看>>