System.Random类在极限运算环境下重复生成随机数的对比实验

本文作者野比通过实验对比了System.Random类在极限运算环境下生成随机数的不同方式,包括默认构造函数、常数种子、时间戳种子等8种常见方法。实验结果显示,尽管有些方法在特定情况下表现出随机性不足,但默认构造函数在大量高强度生成随机数时仍能保持较好的随机性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原创图片,请勿转载

作者:野比(conmajia@gmail.com)

23 May 2012

© 保留所有权利 野比 2012


注:本文为个人尝试,仅供参考。


真随机和伪随机

随机数是计算机编程中一个非常重要的工具。利用它,我们可以完成很多很多很多的事,而且有很多很多很多的事也必须用随机数来完成。所以随机数够不够「随机」,对我们来说,是非常之关键的。在软件编程中,比如C#(其他任何语言均与此类似),我们用System.Random这个类来获得随机数。由于是使用特定算法获取的随机数,所以,从本质上来讲,Random生成的(甚至是任何软件生成的)随机数并非真随机数,而仅是具有一定随机程度的伪随机数。在Wikipedia上对伪随机数的解释是这样的。

伪随机数,或称伪乱数,是使用一个确定性的算法计算出来的似乎是随机的数序,因此伪随机数实际上并不随机。在计算伪随机数时假如使用的开始值不变的话,那么伪随机数的数序也不变。伪随机数的随机性可以用它的统计特性来衡量,其主要特征是每个数出现的可能性和它出现时与数序中其它数的关系。伪随机数的优点是它的计算比较简单,而且只使用少数数值很难推算出计算它的算法。一般人们使用一个假的随机数,比如电脑上的时间作为计算伪随机数的开始值。

目前几乎所有的真随机数发生器(从理论上来说,真随机数只有可能在自然界中由物理现象产生,即由硬件实现)都具有其各自的专利,不是一般人可以接触的。下图列举了部分公司的真随机数发生器专利。



作者:野比(conmajia@gmail.com)

23 May 2012

© 保留所有权利 野比 2012


System.Random的实现原理

我们使用的System.Random类是基于Donald E. Knuth的减随机数生成器算法实现的,从实用角度而言,其随机程度已经足够。在加上Random可以利用int型的种子进行随机化,所以我们在日常使用中并没有感觉到任何问题。


关于测试

其实今天我并不是要研究真随机数,只是在使用过程中,我想到一个情况:如果计算机飞速发展,而计算机又只能生成伪随机数,那么我们现在的一般应用情况。

    Random rand;
    while(true)
    {
        // 用种子初始化随机数
        rand = new Random(seed);
        int value = rand.Next();

        // (费时的操作)
    }

在未来超高速计算下,现在的「费时的操作」也许 未来就一晃而过,用时几乎可以忽略。在这样的极限情况下,上面的语句就变成了单纯的循环生成随机数了。那么这种情况下,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生成方式及相应的随机数生成结果进行对比。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Conmajia

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值