用计算机随机出数,计算机如何产生随机数?

计算机如何产生随机数?

yanlb2000

随机数在计算机和通讯等领域是非常有用的。比如在游戏中生成随机的地形关卡,而在通讯、安全认证等专业领域,随机数更是必须的。

那么计算机如何产生随机数呢?

学过编程的都知道,可以调用随机数函数来生成随机数。比如,在C语言中是rand(),

在Basic中是RND()。但实际上,这些函数产生的并不是真正的随机数。如果简单地调用这些函数产生一系列随机数,那么程序每次运行,都会产生完全相同的随机数序列。每次都相同,还有什么随机性可言?正确的做法是,在调用随机数函数之前,还要初始化随机数“种子”。比如,在C语言中就是srand()。但即使如此,这个所谓的初始化,其实是指定一个随机数的开始的值。只要开始值相同,那么后续序列还是相同的。所以,一般都是用当时的系统时间的秒数值(或毫秒等更小单位)来指定种子,以得到“随机”的序列。而在Basic或Pascal中,调用不带参数的Randomize,就是用系统时钟来设置随机数种子。但如果恰巧两次根据时间也得到相同的开始值种子,那么其后产生的随机数序列也是相同的。

所以,我们通过这种方法的到随机数其实只能称为“伪随机数”,说它伪,是因为其结果完全是可预测的、可重现的。对于任何一个随机数,其后续的随机数都是明确的,可知的。而按照对“随机”的理解,就算知道了某次随机数,也不能得到其后续是什么。

那么为什么我们只能用这种奇怪的伪的随机数,难道计算机不能产生真正随机的数吗?

是的,现在的计算机结构,真是太精确了。因为精确,所以没有一点模糊、随机的地方。在精确的硬件和软件的运行下,理论上就决定了无法产生随机的数值。所以,我们只能用伪随机数。

其实伪随机数也正是通过算法精确计数得到的。比如,最常用是这样的:

Xn+1 = (aXn

+ b) mod c

其中Xn, Xn+1等是随机数序列,而a,b,

c是常数。而第一个数X0就是随机数种子了。a,b,c的值一般取得大些,而且是质数(但也不必全是质数),这样能保证产生的随机数序列看上去更随机,重复少,位数多。

显然,根据这种算法,在a,b,c都确定的情况下,相同的种子X0只能产生相同的序列。

伪随机数序列在一般情况下还能凑合着用,比如在游戏中。但在要求更高的场合,比如重要数据加密和通讯,身份识别和认证,等等,伪随机数可能就不符合要求了。因为这样容易被攻破。所以,高要求场合必须使用真正的随机数。

然而,一个事实是,只有利用真正随机的物理事件(自然现象),才能得到真的随机数值。而我们普通的PC机内部中,理论上不存在这样可以利用的随机物理事件(设备),所以,也就没有真正的随机数可产生了。

那么我们就没有真正的随机数可用了?那倒也不是,还是有很多解决办法的。

以前听说的是,真随机数是这样产生的。利用一个核放射源,就是能不断进行原子核衰变,并伴随衰变放出粒子(α或β粒子),然后用一个检测装置,检测放射源在单位时间内被检测到的粒子数量(脉冲计数)。该数量经过一定的修正,就可以作为随机数使用了。另外,也有通过测定两次衰变的时间间隔来作为依据的。理论上,原子核衰变是原子核内部强力或弱力作用的结果,只根据其内部规律恒定进行,根本不受外界光、电、热、引力等的干扰,是完全随机和稳定的。(这也是使用碳-14同位素测定生物遗骸年代的理论依据。)这种方式,的确完全随机,高度可靠。但显然,能用上这种随机数发生器的,不要说便携式、嵌入式设备不可能,个人PC机不可能,就是一般的企业、院校,也不可能。这样的设备太复杂、庞大、昂贵了。而且,这也仅仅是很久前书本上的老知识,现在究竟有没有这样的设备?不清楚。就算有,那也很稀少了吧。

既然这种设备如此复杂昂贵,那么有没有便捷的方法呢?当然是有的。而且也不少。

有种权宜之计是,利用用户在键盘击键,或者鼠标移动击键时候的时间间隔、移动距离等随机量来产生随机数。但这种方法并不可靠,也不太好用。依靠用户的动作,是不能长时间产生高质量的随机数的。何况,在很多便携设备、嵌入设备(比如IC卡芯片等很微小的设备上),这方法也不管用。

还有的方法是,利用半导体或电路内部的电子噪声,将其放大取值(AD转换),然后作为随机数的源泉。这是相对廉价和现实很多的设计,现在很多微处理器、IC卡芯片等使用了硬件随机数发生器,采用的就是这种方法。

以前在网上看到有介绍适合PC机用的随机数发生器的,就是一块插入电脑扩展槽的PCI卡或ISA卡;或者是个单独的随机数发生器,通过并口与PC机相连。配合一定的驱动程序,就能得到随机数了。我没有查到这种插卡产生随机数的原理,但估计也是利用电子噪声一类的。

而据以前的资料,Intel准备在Pentium

Pro处理器中,置入硬件随机数发生器。但后来好像没下文了。VIA的汉腾(Antaur)号称是第一款内置了硬件随机数发生器的微处理器,但现在有多少用这个处理器的?

既然要得到真随机数这么困难,所以我早就有个设想,能不能利用现在发达的网络资源,来实现随机数资源的共享和服务?比如,架设一些随机数服务器,提供随机数服务?理论上这样做没有什么难度,只要定义好标准的随机数服务端和客户端协议就可以了。RFC?呵呵,反正我是没见到RFC中有这样的协议。鉴于高质量的随机数服务有较大的商业价值,所以收费服务也是可以讨论的。比如,收费的随机数服务将提供稳定的、高速率的、高质量的随机数序列;而免费的服务也可以有,作为科研、个人等使用,但可能在产生速率等服务质量上方面没有收费的好。另外,通过现在越来越发展的无线网络,很多移动设备、便携设备、嵌入设备等不方便接入网线的设备,就也能得到随机数服务了,岂不是更好?

这个想法我好几年前就有,但直到现在,我还是没有见到有这样的随机数服务器的出现。RFC中有很多有用的协议,如用以校准时间的Time协议,也有无聊的Quote

of the

Day,chargen这样的协议,为什么就不定义一个也很有用的随机数协议呢?或者其实是有的,只是我没有找到?!

最后,总结一下:

1, PC机只能产生伪随机数;

2, 要产生真正的随机数是困难甚至昂贵的,需要专门的硬件;

3,

提出随机数服务器的概念,希望将好的随机数发生器通过网络共享出来。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值