什么是随机数?
随机数是专门的随机试验的结果。
随机数最重要的特性是:它所生成的后面的那个数与前面的那个数毫无关系。
首先需要声明的是,计算机不能生成绝对随机的随机数(“真随机数”),只能生成“伪随机数”。
其实绝对随机的随机数只是一种理想的随机数,即使计算机怎样发展,它也不会生成一串绝对随机的随机数。
计算机只能生成相对的随机数,即伪随机数。
未来的量子计算机有可能生成基于自然规律的不可重现的“真随机数”。
随机数有什么用?
在统计学的不同技术中需要使用随机数。比如:
1、在从统计总体中抽取有代表性的样本的时候
2、在将实验动物分配到不同的试验组的过程中
3、在进行蒙特卡罗模拟法计算的时候等等。
实际生活中,这些随机数起着很大的作用,所以很多人会专门去寻找随机数生成器。比如:
1、对银行来说,银行的ID和密码非常脆弱。如果有随机数表,就可以防备此类事件。随机数表是指为每个客户指定各不相同的数字列表,申请时将该随机数表分配给客户,而不是按照一定的规律给出,这就安全很多。
2、要考察某公司的牛奶产品质量,想从800袋牛奶中抽取60袋,就可以在随机数表中选中一数,并用向上、下、左、右不同的读法组成60个数,并按牛奶的标号进行检测,虽然麻烦,但很常用。
3、企业要调查消费者对某产品的需求量,要从很多消费者中抽选一定数量的样本调查。
怎样生成随机数?
生成随机数有多种不同的方法。这些方法被称为随机数发生器。
随机数最重要的特性是:它所生成的后面的那个数与前面的那个数毫无关系。
物理性随机数发生器(true random number generators)
真正的随机数是使用物理现象生成的:比如掷钱币、骰子、转轮、使用电子元件的噪音、核裂变等等。
这样的随机数发生器叫做物理性随机数发生器,它们的缺点是技术要求比较高。
例如:http://www.random.org/ 就是利用大气噪音来生成随机数的,而大气噪音是空气中的雷暴所产生的。
伪随机数发生器(pseudo-random number generators)
在实际应用中往往使用伪随机数就足够了。这些数列是“似乎”随机的数,实际上它们是通过一个固定的、可以重复的计算方法生成的。
计算机或计算器生成的随机数有很长的周期性。
它们不真正地随机,因为它们实际上是可以计算出来的,但是它们具有类似于随机数的统计特征。
这样的发生器叫做伪随机数发生器。
在真正关键性的应用中,比如在密码学中,人们一般使用真正的随机数。
计算机如何生成伪随机数?
有人可能会说,随机数是由“随机种子”产生的。
没错,随机种子是用来产生随机数的一个数,在计算机中,这样的一个“随机种子”是一个无符号整形数。
那么随机种子是从哪里获得的呢?
随机种子来自系统时钟,确切地说,是来自计算机主板上的定时器在内存中的记数值。
(注:计算机的主机板上都会有这样一个定时器用来计算当前系统时间,每过一个时钟信号周期都会使记数器+1)
总结一下前面的:
1、随机数是由随机种子根据一定的计算方法计算出来的数值。所以,只要计算方法一定,随机种子一定,那么产生的随机数就不会变。
2、只要用户或第三方不设置随机种子,那么在默认情况下随机种子来自系统时钟(即定时器的值)。
更直观的看随机数?
下面给出的2个例子分别用javascript和vbscript在intel windows平台下产生的直观随机视图。
即:在html文档中生成一个由2500个随机颜色的10×10的小方块组成的大方块。
从颜色上我们可以初步理解为“杂乱无序”的2500个方块,满足我们在html领域的需求。
另:
random.php
freebsd + apache + php5.2 环境下生成随机数的直观图
// Requires the GD Library header("Content-type: image/png"); $im = imagecreatetruecolor(512, 512) or die("Cannot Initialize new GD image stream"); $white = imagecolorallocate($im, 255, 255, 255); for ($y = 0; $y & lt; 512; $y++) { for ($x = 0; $x & lt; 512; $x++) { if (rand(0, 1) === 1) { imagesetpixel($im, $x, $y, $white); } } } imagepng($im); imagedestroy($im);
参考资料:
[1] http://blog.bluesky.cn/archives/418/true-random-number-and-pseudo-random-number.html
[2] http://baike.baidu.com/view/1587526.htm
[3] http://baike.baidu.com/view/1127.htm
[4] http://baike.baidu.com/view/955147.htm
我居然把(2+2)/1+1=算成了2,人家说我是spam
原来如此:计算机中常用的随机数并非真随机数。而我一直就深以为,其实现实中真正的随机就很难存在,或许只有传说中的量子的不确定性。
我看看算对没。