C#生成随机数的方法小结
作者:小小的我 时间:2023-03-30 22:07:33
本文实例总结了C#生成随机数的方法。分享给大家供大家参考。具体分析如下:
开始,很简单地使用System.Random类来生成随机数。很快,问题就来了,发现当random的生成间隔小于1ms时,随机数就重复了(仅限于每次都新建Random对象),因为新建random时候是默认以当前时间作为随机种子的。将random改为单例,重复数的几率小了,但是随机数在一段时间后循环了(伪随机数嘛,没办法,要求不了这么多的)。
所以,特意在网上找了一些资料,并亲自作了一些性能比较,在此作些总结。
System.Random
这个是伪随机数生成器
缺点:生成出来的结果会循环,且Random对象创建间隔小于1ms的时候产生结果会相同;
优点:生成速度极快;
效率:高,同一个对象产生1,000,000个结果只需要22ms(不含对象创建时间)
System.Security.Cryptography.RandomNumberGenerator
这个是用于产生密码的安全随机数生成器,产生出来的随机数离散度高,产生1,000,000个32位(8-byte)的随机数无重复
缺点:速度很慢,对比System.Random是两个数量级的效率差距;
优点:安全度高,产生的结果可看作环境无关,而且可以填充任意长度的字节数组;
效率:低,同一个对象产生1,000,000个结果需要4221ms(不含对象创建时间)
System.Guid
这个是GUID(UUID)生成器,出来的是128-bit的字节数组,通常被表示为8-4-4-4-12的32个hex字符。
缺点:生成长度一定,而且生成出来的结果可能与环境相关,在高安全需求的环境不适用;
优点:有强大的数学理论支持,在每秒产生10亿笔UUID的情况下,100年后只产生一次重复的机率是50%;
效率:中,产生1,000,000个结果需要255ms(包含Guid对象创建时间)
以上3个都可以当作随机数产生器,但相对于大部分的业务需求, GUID(UUID)已经适用,而且其碰撞几率在同一个系统内几乎是不可能的。所以在选择产生器时GUID是一个不错的选择。
希望本文所述对大家的C#程序设计有所帮助。
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
mybatis防止SQL注入的方法实例详解
深入理解Java虚拟机 JVM 内存结构
![](https://img.aspxhome.com/file/2023/7/103987_0s.png)
C#使用BinaryFormatter类、ISerializable接口、XmlSerializer类进行序列化和反序列化
![](https://img.aspxhome.com/file/2023/5/88425_0s.png)
Unity3d使用FairyGUI 自定义字体的操作
![](https://img.aspxhome.com/file/2023/4/122734_0s.png)
java中同类对象之间的compareTo()和compare()方法对比分析
解决在for循环中remove list报错越界的问题
![](https://img.aspxhome.com/file/2023/6/90036_0s.jpg)
SpringBoot项目中分页插件PageHelper无效的问题及解决方法
利用openoffice+jodconverter-code-3.0-bate4实现ppt转图片
浅谈JVM之java class文件的密码本
![](https://img.aspxhome.com/file/2023/2/101942_0s.jpg)
Spring AOP如何自定义注解实现审计或日志记录(完整代码)
![](https://img.aspxhome.com/file/2023/5/101955_0s.png)
Spring Cloud Alibaba Nacos Config配置中心实现
![](https://img.aspxhome.com/file/2023/0/130910_0s.png)
springboot实现注册加密与登录解密功能(demo)
![](https://img.aspxhome.com/file/2023/4/77484_0s.png)
C#实现winform渐变效果的方法
Android如何在原生App中嵌入Flutter
![](https://img.aspxhome.com/file/2023/2/122132_0s.jpg)
详解SpringCloud mysql实现配置中心
![](https://img.aspxhome.com/file/2023/8/58718_0s.png)
C#实现视频的批量剪辑功能
![](https://img.aspxhome.com/file/2023/3/96423_0s.png)
Java中常用的设计模式之装饰器模式详解
![](https://img.aspxhome.com/file/2023/0/88180_0s.png)
Java虚拟机之类加载
![](https://img.aspxhome.com/file/2023/4/64754_0s.png)
Android源码学习之工厂方法模式应用及优势介绍
![](https://img.aspxhome.com/file/2023/7/120057_0s.png)