注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天朝布衣田中码农参上

苦逼码农的点点滴滴,请多多指教!

 
 
 

日志

 
 
 
 

C#Random产生随机数重复问题  

2017-10-12 09:33:08|  分类: DotNet |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
C#Random类是一个产生伪随机数字的类,它的构造函数有两种,一个是直接New Random(),另外一个是New Random(Int32),前者是根据触发刹那的系统时间做为种子,来产生一个随机数字,后者可以自行设定触发的种子,一般都是用UnCheck((Int)DateTime.Now.Ticks)做为参数种子。采用默认的构造函数,如果计算机运行速度很快,触发Randm函数间隔时间很短[笔者测试了下,如果在同一秒内],就有可能产生一样的随机数。 这个问题,相信大家都遇见过,比如,要解决这个办法也并不难,网上有就有办法利用 System.Security.Cryptography.RNGCryptoServiceProvider 来生成这个随机数种子:

static int GetRandomSeed(){
byte[] bytes = new byte[4];
System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider();
rng.GetBytes(bytes);
return BitConverter.ToInt32( bytes , 0 );
}

Random random = new Random(GetRandomSeed());

调用的时候,虽然解决了随机数重复生成问题,但是另一个问题又来了。在一些比较费时的循环里去,实例化RNG对象可是很消耗资源的。那么能不能转换下思路,用另外的办法来生成这个随机数种子呢。也许可以试试使用Guid() 函数,对于这个,相信大家都熟悉:GUID(全局统一标识符)是指在一台机器上生成的数字,它保证对在同一时空中的任何两台计算机都不会生成重复的 GUID 值(即保证所有机器都是唯一的),利用Guid() 函数来改造下如上函数。

static int GetRandomSeed(){
byte[] bytes = Guid.NewGuid().ToByteArray();
return BitConverter.ToInt32( bytes , 0 );
}
Random random = new Random(GetRandomSeed());

这下性能要好上很多了,大家可以试试看,这里仅是抛砖引玉,当然还有一些更简单的生成随机数种子的办法,希望大家能够更深入研究。
  评论这张
 
阅读(1)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018