从小就一直很好奇,MP3播放器的随机播放功能是如何实现的,今天读到一篇关于随机数的文章,又勾起了我的那时好奇心,索性上下求索,了解了随机数背后的很多知识,顿觉豁然开朗,特意写这篇文章和大家总结分享一下。
其实,随机数在我们身边无处不在。无论是玩扑克牌麻将骰子时的点数,玩LOL时的玩家匹配,还是高大上的量子物理,核聚变,都无一例外地随机数有关,在混沌理论中,这个世界本身就是一系列随机过程的产物——好吧,有点激动,扯得太远了——作为编程爱好者,应该会发现,每一门编程语言必然会有自己的随机数生成函数,常用的比如:C语言stdlib库中的rand()函数,java中Random类中的nextInt () 方法,Python中random模块的randint()方法等等。作为各种编程语言的“官方标配”,这小小的随机函数作用那也是大大的,不光而这看似简单的东西背后学问还真不少。
好了,废话不多讲,现在就让我们走近随机数,看看它的“庐山真面目”!
一、三种随机数生成器
你们有没有想过这个问题——计算机到底是怎么得到随机数的?作为人类,我们大可提笔随便在纸上写一大串数字,也许就算是随机数了,但是计算机可没有这本事,它必须有一个科学稳定的随机数来源,才能得到随机数,这个来源,我们称为随机数生成器。
常见的计算机随机数生成器有三种:一是使用物理方法,称为真随机数生成器(True Random Number Generator),生成的算是真正意义上的随机数,无法预测且无周期性;与真随机数对应的是伪随机数生成器(Pseudo Random Number Generator),它是由算法计算得来的,但这种方法生成的随机数是可预测、有周期的,并不能算真的随机数,因此得名伪随机数;还有第三种方法,叫随机数表法,就是用真随机数生成器事先生成好大量随机数,存到数据库中,使用时再从库中调用。记得高中数学书第三册后附有一个叫随机数表的东西,使用时直接查阅就行,这种方法简单,但缺点是内存占用大,因此不常采用,我也就不展开讲了,在此我只详细介绍一下前两种:真随机数生成器与伪随机数生成器。
二、真随机数生成器
程序员都是完美主义者,我们自然希望有一个能产生真正随机数的程序。遗憾的是,生成真随机数的程序,就像永动机一样无法实现,要得到真正的随机数目前来讲只能看老天的眼色,比如噪声(Noise),量子效应(Quantum effects),人品(RP)这些物理现象。
第一个真随机数发生器是1955年由Rand公司创造的,而在1999年,Intel发布Intel810芯片组时,就配备了硬件随机数发生器,原理利用的是电阻和振荡器生成的热噪声。目前,大部分芯片厂商都集成了硬件随机数发生器,使用十分方便,而一系列为科研和信息安全设计的真随机数发生器也层出不穷,发展到今天,真随机数生成器(以下简称TRNG)大体可分为以下三种:
1、基于电路的TRNG:
1 振荡器采样:如上文中提到的Intel810RNG芯片,利用热噪声(是由导体中电子的热震动引起的)放大后,影响一个由电压控制的振荡器,再通过另一个高频振荡器来收集数据,得到随机数。在Intel 815E芯片组的个人电脑上安装Intel Security Driver(ISD)后,就可以通过编程读取寄存器获取RNG中的随机数。
2 直接放大电路噪声:直接以热噪声等电路噪声为随机源,通过运算放大,统计一定时间内达到阈值的信号数以此来得到随机数。
3电路亚稳态: 2010年,德国的研究团队现在开发出一种真随机数发生器,它使用的计算机内存双态触发器作为随机的一个额外层,触发器可随机的在1或0状态中切换,在切换之前,触发器处于行为无法预测的“亚稳态”。在亚稳态结束时,内存中的内容为完全随机。研究人员对一个触发器单元阵列的实验显示,这种方法产生的随机数比传统方法“随机”约20倍。
4 混沌电路:混沌电路的输出的结果对初始条件很敏感,不可预测,且在IC芯片中易集成,可产生效果不错的真随机数。
5 根据。。。质量?:劣质内存芯片工作在高温下,其数据是不可预测的,读取这里面的数据,就会得到难以预测的随机数,人们采用这种技术,制作了随机数发生器板卡。。。(O(∩_∩)O呵呵 ~)
2、基于物理的TRNG:
如今的量子物理,从本质上讲就是真正随机的,是不可预测的——比较著名的就是薛定谔的猫啦——因此很适合用来做TRNG,当然,这并不是说基于经典宏观物理学的TRNG就不存在,比如http://random.org/这个网站,从1998年开始就在Internet上提供真随机数服务了,它用的是大气噪音来生成真随机数(很不可思议吧)。下面举几个近年来基于量子物理发明的TRNG:
1 http://random.irb.hr/这是一个与克罗地亚计算机科学家发明的TRNG,全名是Quantum Random Bit Generator Service (QRBGS),它依赖于半导体光子发散量子物理过程中内在的随机性,通过光电效应检测光子得到随机数。
2 2010年,比利时物理学家S. Pironio和同事利用纠缠粒子的随机性和非局域性属性(别问我,我也不懂- -)创造出了真随机数。
3 2011年,加拿大渥太华的物理学家Ben Sussman利用激光脉冲和钻石创造了真随机数。Sussman的实验室使用持续几万亿分之一秒的激光脉冲照射钻石,激光进入和出来的方向发生了变化。Sussman称改变与量子真空涨落的相互作用有关,在量子法则中这种作用是不可知的,他认为这可以用于创造真正的随机数。
4 2012年,澳大利亚国立大学的科学家从真空中的亚原子噪音获取随机数,创造了世界上最快的随机数发生器。量子力学中,亚原子对会持续自发的产生和湮灭,通过监听真空内亚原子粒子量子涨落产生的噪音,可以得到真正的随机数。
3、基于其他因素的TRNG:
1 PuTTYgen:它的随机数是让用户移动鼠标达到一定的长度,之后把鼠标的运动轨迹转化为种子,由此产生随机数
2 Linux自1.3.30版就在内核提供了真随机数生成器(至少是理论上),它利用机器的噪音生成随机数,噪音源包括各种硬件运行时速,用户和计算机交互时速。比如击键的间隔时间、鼠标移动速度、特定中断的时间间隔和块IO请求的响应时间等。
3 人可不可以生成随机数呢?嘿嘿,掷骰子斗地主啥的我就不说了,据说某些HR选简历的方式是,往天上一扔,掉在桌子上的简历就通过。。。这个可是真随机啊!
另外:
用Java可以使用java.security.SecureRandom 产生真随机数(待查);
Linux系统有/dev/random,/dev/urandom向用户提供真随机数;
Windows系统有CryptGenRandom 函数生成真随机数(待查)
感兴趣的可以研究一下。
基于物理的随机数生成器,生成的随机数无周期,不可预测,分布均匀,然而,这种随机数生成器技术要求高,而且随机数生成效率不高,难以满足计算机高速计算的需要,因此为了提高数据产生效率,它们都常被用来生成伪随机数生成器的“种子”(seed),并以此生成伪随机的输出序列。
鉴于篇幅太长,关于伪随机数生成器的介绍放到下一篇博客了,请大家持续关注啊!
相关推荐
概要:这是一个基于Verilog的随机数生成器代码,旨在生成指定范围内的随机数。该代码采用了特定的随机数生成算法,并通过Verilog语言实现了随机数的生成和输出功能。 适用人群:该代码适用于具有FPGA编程和Verilog...
在现代信息安全领域中,随机数生成器(RNG)是至关重要的组成部分之一,它为加密算法提供不可预测的数据输入,从而确保数据的安全性。《RNG随机数标准FIPS140-2》这一文档详细阐述了联邦机构如何确保其使用的加密...
首先,随机数生成器(Random Number Generator, RNG)是计算机科学中用于生成看似无规律的数字的程序或设备。在安全领域,高质量的随机数对于密码学、密钥交换、数据加密等至关重要。ANSIX9.17是一个关于电子资金...
【网络安全协处理器中的真随机数生成器】 在网络安全领域,真随机数生成器(TRNG)扮演着至关重要的角色,因为它们为加密算法提供不可预测的密钥和随机数,从而确保通信的安全性。本文主要关注一款应用于网络安全协...
传统的随机数生成方法可能存在可预测性,从而对安全性构成威胁,而量子随机数发生器则提供了无法预测的随机性,极大地增强了安全性。 在2017年《信息安全研究》期刊的量子信息安全专刊中,可能详细探讨了量子随机数...
真随机数生成器(TRNGs)能够产生完全不可预测且不可重复的随机数序列,而伪随机数生成器(PRNGs)则依赖于特定的算法和初始种子来生成看似随机但实际上可预测的序列。 #### 随机数的重要性 随机数在多个领域内...
随机数的质量直接影响到加密的安全性,因此必须使用高质量的真随机数生成器(TRNG)或伪随机数生成器(PRNG)。 在实际应用中,STM32的硬件加密模块可能包含内置的PRNG,但为了达到最高安全标准,开发者通常会结合...
2. **初始化伪随机数生成器**:使用随机数种子初始化一个伪随机数生成器(PRNG),如线性同余法、Mersenne Twister等。 3. **加密数据**:将明文数据与PRNG生成的随机序列进行某种数学运算(如异或操作)来生成密文...
TIA博途中的随机函数库使得用户无需自行编写复杂的随机数生成算法,只需调用预定义的函数,即可快速便捷地获取所需类型的随机数。 在TIA博途V15.1的随机函数全局库文件中,包含了多种随机数生成函数。例如,可能...
1. 随机数生成器的种子必须是不可预测的,这样才能确保生成的序列是随机的且不可预测,从而保证加密的安全性。 2. 不同平台可能会有不同的默认随机数生成器实现,这可能导致在某些情况下生成的密钥不一致,特别是在...
该程序没有使用伪形式的随机数生成,而是采用了诸如鼠标移动之类的用户输入,并将其与时钟定时相结合,以获得真正的随机性。流动整个程序在控制台上运行。 有一个非常简单的设置过程,要求用户提供一些基本知识,...
中国国家标准GM/T 0005-2021为我国提供了关于随机数生成器测试的标准,确保了国产化信息安全系统的随机数质量。本文将详细解析这一标准,并结合随机数检测工具Demo,探讨其应用和重要性。 一、国密随机数检测工具...
产生随机数,并用RSA算法进行加密和解密
1. 随机数的种子:为了确保每次运行程序都能得到不同的随机数序列,通常会在程序开始时用当前时间或其他不可预测的值初始化随机数生成器。 2. 重复性:如果需要避免重复的随机数,可以使用集合或列表来存储已生成的...
6. **第三方库**:虽然JavaScript内置的随机数生成器在大多数情况下足够用,但在某些特殊需求下,可能需要借助第三方库,如`seedrandom.js`,它允许我们设置随机数生成的种子,以便复现随机数序列。 易语言是一种...
1.随机数 ...“crypto/rand”的rand包实现了用于加解密的更安全的随机数生成器。 3.生成指定位数随机数 以生成六位随机数为例 package main import ( fmt math/rand ) func CreateCaptcha() string {
GGD随机数生成器可以用于创建独特的水印,由于其统计特性,这些水印在不影响媒体质量的同时,又能提供有效的版权保护。 接下来,我们提到的Box-Muller算法是生成标准正态(即高斯)分布随机数的一种常用方法。该...
随机数的生成方法多种多样,从简单的伪随机数生成器(PRNG)到更复杂的真随机数生成器(TRNG)。PRNG基于数学公式或者算法,例如线性同余法、Mersenne Twister等,它们可以快速生成,但有一定的可预测性。而TRNG则...
"电信设备-基于量子真随机数的移动终端保密系统及方法"这一主题深入探讨了如何利用量子真随机数生成技术来增强移动终端的安全性。下面将详细阐述相关知识点。 首先,我们要理解什么是量子真随机数。在传统的计算机...
支付宝密钥生成器是一款专为支付宝接口开发设计的工具,其主要功能是生成2048位的RSA256加密密钥对。RSA是一种非对称加密算法,广泛应用于网络安全领域,包括数字签名、数据加密等场景。2048位的密钥长度提供了足够...