• HOME
  • DOCS
  • WTF
  • TECH
  • LIFE
  • PAGES
    • ARCHIVE
    • TAGS
    • ABOUT
    • FRIENDS
    • RSS
  • TOOLS
    • GEO
    • RANDOM()
    • GOO.GL
    • CSS HEART
Aj's Blog

记录时间溜走的瞬间和折腾过的那些事

科普:什么是随机数?随机数有什么用途?(真随机、伪随机、随机数生成器、随机种子)
2011-01-16 @ DOCS 3

什么是随机数?
随机数是专门的随机试验的结果。

随机数最重要的特性是:它所生成的后面的那个数与前面的那个数毫无关系。

首先需要声明的是,计算机不能生成绝对随机的随机数(“真随机数”),只能生成“伪随机数”。

其实绝对随机的随机数只是一种理想的随机数,即使计算机怎样发展,它也不会生成一串绝对随机的随机数。

计算机只能生成相对的随机数,即伪随机数。

未来的量子计算机有可能生成基于自然规律的不可重现的“真随机数”。

随机数有什么用?

在统计学的不同技术中需要使用随机数。比如:

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的小方块组成的大方块。

js_random.htm

vbs_random.htm(IE ONLY)

从颜色上我们可以初步理解为“杂乱无序”的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

下一篇:   科普:什么是3D电影?(3D电影原理及2011年度即将上映3D电影大全)
上一篇:   开源软件授权协议详解(GPL/MPL/LGPL/BSD/Apache Licence/Creative Commons/MIT)
  • 乌帮图 says:
    November 6, 2012 at 20:56

    我看看算对没。

    Reply
  • 55380855 says:
    May 24, 2012 at 04:19

    我居然把(2+2)/1+1=算成了2,人家说我是spam

    Reply
  • 55380855 says:
    May 24, 2012 at 04:15

    原来如此:计算机中常用的随机数并非真随机数。而我一直就深以为,其实现实中真正的随机就很难存在,或许只有传说中的量子的不确定性。

    Reply
  • Cancel reply