电脑是否能产生真随机数?
答案:4 悬赏:30 手机版
解决时间 2021-11-17 21:42
- 提问者网友:情歌越听越心酸
- 2021-11-17 16:19
电脑是否能产生真随机数?
最佳答案
- 五星知识达人网友:拜訪者
- 2021-11-17 16:35
- 计算机理论上可以产生统计意义上的真随机数 。首先,「真随机」也有不同的含义, 真正的真随机目测只有量子力学了……一般的所谓真随机不是指这个,而是指 统计意义 上的随机,也就是具备不确定性,可以被安全的用于金融等领域,下面的真随机也均指这个。
大部分程序和语言中的随机数(比如 C 中的,MATLAB 中的),确实都只是 伪随机 。是由可确定的函数(比如线性同余),通过一个种子(比如时钟),产生的伪随机数。这意味着:如果知道了种子,或者已经产生的随机数,都可能获得接下来随机数序列的信息(可预测性)。
直观来想,计算机是一种可确定,可预测的的设备,想通过一行一行的确定的代码自身产生真随机,显然不可能。但是, 我们或许可以迂回一下 ,一个典型的例子就是 UNIX 内核中的随机数发生器(/dev/random),它在 理论上能产生真随机 。即这个随机数的生成,独立于生成函数,或者说这个产生器是非确定的。
实现方法:简单的讲就是软硬结合,或者说,引入系统外的变量(把软件,代码,算法想象成一个封闭的系统)。具体来讲,UNIX 维护了一个 熵池 ,不断收集非确定性的设备事件,即机器运行环境中产生的 硬件噪音 来作为种子。 比如说:IO请求的响应时间, 特定硬件中断的时间间隔, 键盘敲击速度,鼠标移动速度,甚至周围的电磁波等等……直观的说, 你每按一次键盘,动一下鼠标,邻居家 wifi 信号强度变化,磁盘写入速度,等等信号,都可能被用来生成随机数 。
程序和算法本身不能产生真随机,但是计算机系统作为整体可以迂回产生统计意义上的真随机 。
全部回答
- 1楼网友:忘川信使
- 2021-11-17 19:43
计算机可以生成真随机数,这是由于其在进行硬件驱动时,不可避免的受到不确定因素的影响而产生随机性,例如计算机至少需要显示驱动和发声驱动吧,体现在计算机编程语言上就是涉及显卡驱动和声卡驱动的编程函数有的执行时间是随机的,即使你连续调用这些函数执行时间也是变化的,利用这些就可以生成真随机数了。其它方法也不少就不多说了。
- 2楼网友:woshuo
- 2021-11-17 19:23
随机数是不可能的,都是伪随机数。
但是随机数与你说的摩擦、碰撞有关系吗?
但是随机数与你说的摩擦、碰撞有关系吗?
- 3楼网友:笑迎怀羞
- 2021-11-17 18:10
目前由计算机产生的所有所谓的随机数都是伪随机数.
采用随机变化的种子再产生伪随机数,得到的结果更随机些,但它还是伪随机数. 因为如果重复这个过程(给同样值的种子),得到的结果是重复的(同样的).
如果不采用随机变化的种子,单用rand(),它只会产生固定的序列.例如: for(i=0;i<10;i++)printf("%d ",rand()); 每次运行输出的还是那十个数.
谈随机数的分布,涉及统计的概念,统计的前提是要有大量的样品.做到大量样品的分布满足某种分布(包括均匀分布或某种谱分布),算法上是不困难的.
我们在实验室里模拟天然海浪,让海浪符合设定的频谱和方向谱,还要满足波高和周期的时域统计分布,还有波群统计相似,单靠计算机提供的伪随机数是不够的,须要加上自己的算法,才能同时满足频域和时域的要求.
"我只要知道伪随机数用的是哪种算法,就能准确的知道下一个数将是什么",是对的,例如用时间做种子,你只要给入同样的时间,就能得到同样的结果.
采用随机变化的种子再产生伪随机数,得到的结果更随机些,但它还是伪随机数. 因为如果重复这个过程(给同样值的种子),得到的结果是重复的(同样的).
如果不采用随机变化的种子,单用rand(),它只会产生固定的序列.例如: for(i=0;i<10;i++)printf("%d ",rand()); 每次运行输出的还是那十个数.
谈随机数的分布,涉及统计的概念,统计的前提是要有大量的样品.做到大量样品的分布满足某种分布(包括均匀分布或某种谱分布),算法上是不困难的.
我们在实验室里模拟天然海浪,让海浪符合设定的频谱和方向谱,还要满足波高和周期的时域统计分布,还有波群统计相似,单靠计算机提供的伪随机数是不够的,须要加上自己的算法,才能同时满足频域和时域的要求.
"我只要知道伪随机数用的是哪种算法,就能准确的知道下一个数将是什么",是对的,例如用时间做种子,你只要给入同样的时间,就能得到同样的结果.
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯