像计算机这样完全逻辑化的机器如何才能生成随机数?

An image of digital data in zeros and ones.
计算机编程是一个多样化的话题。Andriy Onufriyenko / Getty Images

计算机生成随机数有两种方法

您可以创建某种设备来监测一个完全随机的自然事件,并将其结果发送给计算机。例如,您可以将一块放射性材料放在盖革计数器(Geiger counter)前,并将盖革计数器连接到计算机。由于放射性衰变是随机的,盖革计数器将生成真正的随机数。这种方法相当罕见,因为很少有人将盖革计数器连接到他们的机器上。您可以创建一个公式来生成伪随机数。在设计公式时,其目的是使其产生一串数字,这些数字对于不知道公式的人来说看起来是随机的。一个好的公式的特点包括

广告

  • 不重复:序列不会循环并重复。良好的数值分布:如果公式生成0到9之间的随机数,那么在很长一段时间内,它生成的零、一、二等的数量应该大致相等。缺乏可预测性:除非您知道公式和种子(初始值),否则无法预测下一个数字是什么。

以下是Kernighan和Ritchie所著《C程序设计语言》中一个简单随机数公式的例子

int rand() {  random_seed = random_seed * 1103515245 +12345;   
return (unsigned int)(random_seed / 65536) % 32768; }

这个公式假设存在一个名为random_seed的变量,该变量最初设置为某个数字。random_seed变量乘以1,103,515,245,然后将12,345添加到乘积中;random_seed随后被这个新值取代。这实际上是一个相当不错的伪随机数生成器。它具有良好的分布性,并且不重复。如果您用它生成0到9之间的随机数,如果种子为10,它生成的前20个值如下:

44607423505664567674

如果您让它生成0到9之间的10,000个值,分布情况如下:

0 - 10151 - 10242 - 10483 - 9964 - 9885 - 10016 - 9967 - 10068 - 9659 - 961

任何伪随机数公式都依赖于种子值来启动序列。如果您使用相同的种子开始,您将从公式中获得相同的数值序列。因此,如果您在某台计算机上给上面所示的rand()函数一个10的种子,并查看它生成的数字流,它将与在任何一台以10为种子运行的计算机上生成的数字流相同。对于全球定位系统,这种可重现性被用来为每个卫星提供可预测但不同的数值模式,供GPS接收器跟踪。

为了创建随机且不可预测的序列,种子必须是一个真正的随机数。为了获得这个真正的随机数作为种子,大多数程序使用当前日期和时间,并将其转换为整数值(例如,转换为自1970年1月1日以来经过的秒数)。由于每次启动程序时这个数字都不同,因此它是一个很好的种子。

有关计算机和编程的更多信息,请参阅下一页。

广告

常见问题

谷歌有随机数生成器吗?
是的,谷歌有随机数生成器。

广告

加载中...