美文网首页
计算机产生随机数到底有多难

计算机产生随机数到底有多难

作者: a_flying_fish | 来源:发表于2017-10-22 20:40 被阅读0次

姓名:余甜  学号:16180288004

转载自  http://www.cnblogs.com/dirgo/p/4876590.html 有改动

【嵌牛导读】:对于人类这种生命体而言,也许随机在某些时候简直就是轻而易举,因为人是主观的、有意识的。恰好相反,计算机却只能按照确定的过程做确定的事,那么在这种情况下,随机数的产生就显得尤为困难。然而在游戏,密码学等等领域,随机数却又是必不可少的,因此人类想出了各种方法来使得计算机生成人类期望得到的随机数。

【嵌牛鼻子】:计算机产生随机数

【嵌牛提问】:你能想到其他的方式,更简单的产生随机数吗?

【嵌牛正文】:

首先,「真随机」也有不同的含义,若想要「真正的真随机」目测只能靠量子力学了。一般的所谓真随机不是指这个,而是指统计意义上的随机,也就是具备不确定性,可以被安全的用于金融等领域,下面说的也是这种。

答案是,计算机系统可以产生统计意义上的真随机数

大部分程序和语言中的随机数(比如 C 中的,MATLAB 中的),确实都只是伪随机。是由可确定的函数(常用线性同余),通过一个种子(常用时钟),产生的伪随机数。这意味着:如果知道了种子,或者已经产生的随机数,都可能获得接下来随机数序列的信息(可预测性)。

直观来想,计算机是一种可确定,可预测的的设备,想通过一行一行的确定的代码自身产生真随机,显然不可能。但是,我们或许可以迂回一下……

实现方法简单说就是软硬结合,或者说,引入系统外的变量(把软件,代码,算法想象成一个封闭的系统)。

一个典型的例子就是 UNIX 内核中的随机数发生器(/dev/random),它在理论上能产生真随机。即这个随机数的生成,独立于生成函数,这时我们说这个产生器是非确定的。

具体来讲,UNIX 维护了一个熵池,不断收集非确定性的设备事件,即机器运行环境中产生的硬件噪音来作为种子。

比如说:时钟,IO 请求的响应时间,特定硬件中断的时间间隔,键盘敲击速度,鼠标位置变化,甚至周围的电磁波等等……直观地说,你每按一次键盘,动一下鼠标,邻居家 wifi 信号强度变化,磁盘写入速度,等等信号,都可能被用来生成随机数。

更具体的,内核提供了向熵池填充数据的接口:

比如鼠标的就是

void add_mouse_randomness(__u32 mouse_data)

内核子系统和驱动调用这个函数,把鼠标的位置和中断间隔时间作为噪音源填充进熵池。

所以,结论是,程序和算法本身不能产生真随机,但是计算机系统作为整体可以迂回产生统计意义上的真随机。

参考:

内核源码在/drivers/char/random.c

Windows 中也有相对的随机数生成器,基本的思想是一致的

如果要求更高的话,也有专用的设备,可收集附近的电磁场等环境噪音来产生随机数

相关文章

  • 计算机产生随机数到底有多难

    姓名:余甜 学号:16180288004 转载自 http://www.cnblogs.com/dirgo/p/4...

  • srand48(time(0))随机产生一种颜色

    计算机产生的随机数并不是真正随机的,所以叫 伪随机数。当“种子”固定时,它产生的随机数序列是不变的,例如产生10个...

  • C/C++伪随机数

    伪随机数 首先我们必须要明确的是,计算机里头产生的“随机数”不是真正意义上的随机数,它是计算机中的随机函数按照某种...

  • Pseudo-random algorithm: prd and

    计算机产生的大多数随机数都是伪随机数。是按照分布概率产生随机数字的过程,数字在概率分布上满足随机要求,但实际上是计...

  • 一文带你读懂生成随机数的方式?

    计算机的随机数都是由伪随机数。例如:rand() 函数可以用来产生随机数,但是这不是真正意义上的随机数,是一个伪随...

  • Unity3D利用随机数种子每次产生同样的随机数

    一般计算机的随机数都是伪随机数,以一个真随机数(随机数种子)作为初始条件,然后用一定的算法不停迭代产生随机数。Un...

  • 比特币地址

    首先介绍随机数: 首先产生真正的随机数目前的计算机无法做到,目前来看只能量子力学能达到吧,计算机目前只能做到统计学...

  • C语言获取随机数

    第一次接触C语言中的随机数时,很疑惑为什么有种子这个玩意,只提供一个产生随机数的函数不就行了吗,因为计算机不能产生...

  • c++随机数

    c++产生若干随机数 产生某一区间的随机数

  • rand()和srand()

    计算机的随机数都是由伪随机数,即是由小M多项式序列生成的,其中产生每个小序列都有一个初始值,即随机种子。(注意: ...

网友评论

      本文标题:计算机产生随机数到底有多难

      本文链接:https://www.haomeiwen.com/subject/aqenuxtx.html