随机数(Random Number)是一个重要的数学概念,它广泛的应用于计算机各个领域之中。例如:在计算机密码学(Computer Cryptography)中,一些算法使用随机数来生成密钥(Private Key);在计算机建模(Modeling and Simulation)中,一些算法利用随机数来对数据进行抽样(Sampling);快速排序算法(Quicksort Algorithm)在每一次迭代完成之后,可能会随机地选择下一个pivot。
在计算机领域内,随机数的概念比较容易理解。给定一个集合,每次从这个集合中取出一个元素,取出之后,再将这个元素放回该集合。按照如此方式重复操作,如果取出的元素符合以下两个条件,则我们可以认为每次取出的元素为随机数。
抛硬币是一个很好的例子。正面朝上和反面朝上是两种可能出现的结果。因此,抛硬币的结果是一个包含两个元素的集合。在每次抛出之前,我们无法预知抛出之后的结果,因此,抛硬币满足上述的第一个条件。当抛硬币的次数逐步增加后,正面朝上的次数和反面朝上的次数大略相同。这满足上述的第二个条件。
虽然随机数的概念容易被人们理解和接受,但是,在计算机领域中,生成随机数是一个非常困难的问题。至今为止,计算机系统尚不能生成一个真正的随机数。
为什么计算机不能生成真正的随机数呢?这是因为随机数的概念与计算机的设计理念是完全相反的。计算机系统的一个本质特点是确定性(Deterministic)。即,在相同的运行环境下,使用相同的输入、运行相同的算法,得到的结果必然相同。这个特性又被称为可重复性(Repeatability)。然而,我们对照上述的随机性的两个条件来看,计算机系统不满足条件一,因为下一次取出的元素是确定的,可重复的。
因为计算机不能生成真正的随机数;由计算机生成的随机数被称为伪随机数(Pseudo Random Number)。既然,计算机自身具有确定性,那么,计算机如何生成随机数呢?
生成随机数的设备(Device)或者算法(Algorithm)被称为随机数生成器(Random Number Generator)。随机数生成器大致可分为两类:
我们使用一个简单的软件随机数生成算法来解释随机数生成过程以及种子的使用方式。平方取中法(Middle-Square Method)是由冯·诺伊曼于1946年提出的。其方法工作如下:
我们用下面的例子来解释平方取中法的工作过程。
平方取中法有许多缺陷。其中,最明显的一个弱点是它的周期很短,容易出现重复序列。因此,人们发明了更多更好的伪随机数生成算法。
小水滴提供了在线随机数生成工具,欢迎大家使用。
本章介绍了随机数的基本概念,以及在计算机系统中伪随机数的生成原理。总而言之,计算机系统很难生成真正的随机数。对于绝大多数计算机系统而言,伪随机数已经足够满足应用需求。
注册用户登陆后可留言