常用的Random生成方法在极限条件下的对比实验.docVIP

常用的Random生成方法在极限条件下的对比实验.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
常用的Random生成方法在极限条件下的对比实验

真随机和伪随机 随机数是计算机编程中一个非常重要的工具。利用它,我们可以完成很多很多很多的事,而且有很多很多很多的事也必须用随机数来完成。所以随机数够不够「随机」,对我们来说,是非常之关键的。在软件编程中,比如C#(其他任何语言均与此类似),我们用System.Random这个类来获得随机数。由于是使用特定算法获取的随机数,所以,从本质上来讲,Random生成的(甚至是任何软件生成的)随机数并非真随机数,而仅是具有一定随机程度的伪随机数。在Wikipedia上对伪随机数的解释是这样的。 伪随机数,或称伪乱数,是使用一个确定性的算法计算出来的似乎是随机的数序,因此伪随机数实际上并不随机。在计算伪随机数时假如使用的开始值不变的话,那么伪随机数的数序也不变。伪随机数的随机性可以用它的统计特性来衡量, 其主要特征是每个数出现的可能性和它出现时与数序中其它数的关系。伪随机数的优点是它的计算比较简单,而且只使用少数数值很难推算出计算它的算法。一般人们使用一个假的随机数,比如电脑上的时间作为计算伪随机数的开始值。 目前几乎所有的真随机数发生器(从理论上来说,真随机数只有可能在自然界中由物理现象产生,即由硬件实现)都具有其各自的专利,不是一般人可以接触的。下图列举了部分公司的真随机数发生器专利。 ? 作者:野比(conmajia@) 23 May 2012 ? 保留所有权利 野比 2012 System.Random的实现原理 我们使用的System.Random类是基于Donald E. Knuth的减随机数生成器算法实现的,从实用角度而言, 其随机程度已经足够。在加上Random可以利用int型的种子进行随机化,所以我们在日常使用中并没有感觉到任何问题。 ? 关于测试 其实今天我并不是要研究真随机数,只是在使用过程中,我想到一个情况:如果计算机飞速发展,而计算机又只能生成伪随机数,那么我们现在的一般应用情况…… 1 Random rand; 2 while(true) 3 { 4 // 用种子初始化随机数 5 rand = new Random(seed); 6 int value = rand.Next(); 7 8 // (费时的操作) 9 } 在未来超高速计算下,现在的「费时的操作」也许 未来就一晃而过,用时几乎可以忽略。在这样的极限情况下,上面的语句就变成了单纯的循环生成随机数了。那么这种情况下,Random生成的数值,还能不能够保证「一定程度的随机」呢?来做个实验看看。 ? 实验条件 CPU:i3 380m 2.56GHz 2核4线程 内存:DDR3 1066 2GB x2 硬盘:TOSHIBA MK3265GSX (320 GB) @ 5400 RPM runtime:.NET Framework版本:v2.0.50727(C#2.0) 开发:Visual Studio 2005 Team Suite OS:Windows XP SP3 ? 实验方法 模拟最严酷的环境,使用类似下面这样的代码,通过改变不同的rand生成方式和count数,对多种Random生成方式及相应的随机数生成结果进行对比。 1 // 示例代码,不可用 2 for(int i = 0; i count; i++) 3 { 4 rand.Next(); 5 } 作者:野比(conmajia@) 23 May 2012 ? 保留所有权利 野比 2012 实验用例 这次实验测试以下8种常见的随机数生成方式(找找看你一般用的第几种): 1. 默认构造函数 使用Random rand=new Random()。这是最为简单的生成方法,单次生成,不重复。这也是MSDN建议的生成方式。 2. 默认构造函数(重复创建) 仍然使用默认构造函数,但是在每次循环中都重新创建Random变量,即不停的rand=new Random(),下同。 3. 用常数作为种子 使用rand=new Random(10)。用常数作为种子创建rand变量。单次,类似用例#1。 4. 用常数作为种子(重复创建) 类似用例#2。 5. 用时间刻度作为种子(重复创建) 这是比较普遍的一种用法,每次利用系统当前时间作为种子创建rand变量。使用DateTime.Now.Ticks(此属性的值表示自 0001 年 1 月 1 日午夜 12:00:00 以来已经过的时间的以 100 毫微秒为间隔的间隔数)。 注意该方法只能重复创建,否则将成为用例#3。 6. 用随机数作为种子(重复创建) 这是一种「看起来很随机的」方法,使用另一个Random变量,在每次循环时用

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档