C#生成随机数的方法小结
本文实例总结了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#程序设计有所帮助。
相关推荐
-
C#生成设置范围内的Double类型随机数的方法
本文实例展示了C#实现生成设置范围内的Double类型随机数的方法,对于C#的学习来说有不错的借鉴价值,分享给大家供大家参考. 关键代码如下: /// <summary> /// 生成设置范围内的Double的随机数 /// eg:_random.NextDouble(1.5, 2.5) /// </summary> /// <param name="random">Random</param> /// <param name=&q
-
C#生成指定范围内的不重复随机数
C#生成指定范围内的不重复随机数 // Number随机数个数 // minNum随机数下限 // maxNum随机数上限 public int[] GetRandomArray(int Number,int minNum,int maxNum) { int j; int[] b=new int[Number]; Random r=new Random(); for(j=0;j<Number;j++) { int i=r.Next(minNum,maxNum+1); int num=0; for
-
用C#生成不重复的随机数的代码
对于随机数,大家都知道,计算机不 可能产生完全随机的数字,所谓的随机数发生器都是通过一定的算法对事先选定的随机种子做复杂的运算,用产生的结果来近似的模拟完全随机数,这种随机数被称 作伪随机数.伪随机数是以相同的概率从一组有限的数字中选取的.所选数字并不具有完全的随机性,但是从实用的角度而言,其随机程度已足够了.伪随机数的选 择是从随机种子开始的,所以为了保证每次得到的伪随机数都足够地"随机",随机种子的选择就显得非常重要.如果随机种子一样,那么同一个随机数发生器产生 的随机数也会一样.
-
C# 生成验证码取随机数字加字母(改进版)
之前一直用的生成验证码方法,取4位数字没有问题,结果加上字母,取6位后,效率非常低. 改进了一下,方法如下 复制代码 代码如下: var text2 = ""; var random = new Random((int)DateTime.Now.Ticks); const string textArray = "23456789ABCDEFGHGKLMNPQRSTUVWXYZ"; for (var i = 0; i < iVcodeNum; i++) { te
-
C#中获取、生成随机数的三种方法
随机数的定义为:产生的所有数字毫无关系. 在实际应用中很多地方会用到随机数,比如需要生成唯一的订单号. 在C#中获取随机数有三种方法: 一.Random 类 Random类默认的无参构造函数可以根据当前系统时钟为种子,进行一系列算法得出要求范围内的伪随机数. 复制代码 代码如下: Random rd = new Random(); int i = rd.Next(); 这种随机数可以达到一些要求较低的目标,但是如果在高并发的情况下,Random类所取到的系统时钟种子接近甚至完全一样,就很有可能出
-
C#生成不重复随机数列表实例
复制代码 代码如下: /// <summary> /// 生成不重复随机数列表实例 /// </summary> /// <param name="count">不重复数数量</param> /// <returns>不重复数列表</returns> private static List<int> GetRandomList(int
-
C#可用于登录验证码的四位随机数生成方法
本文实例讲述了C#可用于登录验证码的四位随机数生成方法.分享给大家供大家参考.具体实现方法如下: 这里提供了两种方法,调用其一即可: 复制代码 代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace SJ_random { class Class_main {
-
c#与js随机数生成方法
本文实例讲述了c#与js随机数生成方法.分享给大家供大家参考.具体如下: 1. C#产生随机数方法: 复制代码 代码如下: Random rd = new Random(); rd.Next(low,high); 说明:生成70-100的随机数 复制代码 代码如下: Random rd = new Random(); rd.Next(70,100); 2. js随机数方法: 复制代码 代码如下: Math.ceil(Math.random() * (1 + high - low) + low)
-
C#生成随机数实例
本文实例讲述了C#生成随机数的方法.分享给大家供大家参考.具体如下: 复制代码 代码如下: /// <summary> /// 生成num位数验证码 用于短信验证功能 /// </summary> public static Random rand = new Random(); public static string getCode(int num) { string result = ""; string s = "
-
C#生成随机数功能示例
本文实例讲述了C#生成随机数功能.分享给大家供大家参考,具体如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace csharp { class Program { static void Main(string[] args) { Console.WriteLine("生成随机数\n"); int randCount = 9;//随机数发的个
-
C#实现在两个数字之间生成随机数的方法
本文介绍一个小编自己写的C#函数,它用于生成两个数之间的一个随机数. 在C#中有一个Random类,使用它可以很方便的生成随机数.其实一个最重要的生成方式就是给它一个最大值和一个最小值,系统可以自动生成该范围内的一个随机数字. 在创建Random对象的时候,需要赋值一个随机数种子.随机数种子是什么含义本文就不介绍了,反正如果没有种子,那么每次得到的随机数会是同一个随机数(很扯蛋是吧).这里我们使用Guid类的NewGuid()方法来造一个随机的字符吕,而且这个字符串是不会相同的.这个Guid的随
-
C#生成互不相同随机数的实现方法
本文实例讲述了C#生成互不相同随机数的实现方法,在进行C#应用程序设计时非常具有实用价值.本文详细讲述了其功能的实现过程.分享给大家供大家参考之用.具体方法如下: 一般来说,用C#生成足够随机的互不相同的随机数 Dotnet.Frameword中提供了一个专门产生随机数的类System.Random,计算机并不能产生完全随机的数字,它生成的数字被称为伪随机数,它是以相同的概率从一组有限的数字中选取的,所选的数字并不具有完全的随机性,但就实用而言,其随机程度已经足够了. 在使用随机数时,要先初始化
随机推荐
- java 反射和动态代理详解及实例代码
- 详解iOS多线程之2.NSThread的加锁@synchronized
- 不错的用外部Javascript修正特定网页内容
- bootstrap选项卡使用方法解析
- 延长phpmyadmin登录时间的方法
- 在Python的setuptools框架下生成egg的教程
- MySQL入门教程(七)之视图
- PHP实现上传多图即时显示与即时删除的方法
- 用实际代码演示Ruby的容易被误解的6个特性
- 利用ROW_NUMBER() OVER函数给SQL数据库中每一条记录分配行号的方法
- jquery操作select取值赋值与设置选中实例
- javascript 焦点的两个问题
- 详细解读JavaScript编程中的Promise使用
- 3389 远程桌面连接的使用技巧
- 暴力破解FTP服务器技术探讨与防范措施分享
- 网站优化之提高域名信任度的几个简单方法
- Python利用QQ邮箱发送邮件的实现方法(分享)
- C# 将字节流转换为图片的实例方法
- Go语言字符串高效拼接的实现
- mysql聚簇索引的页分裂原理实例分析