精华内容
下载资源
问答
  • 量子真随机数发生器研究取得进展超高速真随机数发生器简化设计方案(上)与后处理方法(下)信息科学技术学院郭弘教授课题组与物理学院张建玮副教授课题组开展合作,在用光学随机源设计研制量子真随机数发生器的研究中...

    量子真随机数发生器研究取得进展

    d949dc9c7a0fc4950e82d0be8655e03f.png

    323a911106c70180149c278cac09efab.png

    超高速真随机数发生器简化设计方案(上)与后处理方法(下)

    信息科学技术学院郭弘教授课题组与物理学院张建玮副教授课题组开展合作,在用光学随机源设计研制量子真随机数发生器的研究中取得重要进展,相关成果发表在《激光物理快报》(Laser Physics Letters)上,论文题目为《基于超亮发光二极管实现速率1.6 Tbit/s 的真随机数发生器》(Yu Liu, Mingyi Zhu, Bin Luo, Jianwei Zhang, Hong Guo. Implementation of 1.6 Tbit/s truly random number generation based on a super-luminescent emitting diode, Laser Physics Letters, 2013, 10: 045001, doi: 10.1088/1612-2011/10/4/045001)。

    近期,郭弘课题组已在真随机数发生器研究领取得了一系列研究成果。例如,通过对离散型和连续型量子随机源的持续研究,在随机源的建模分析、信号采集手段、数据后处理方法和随机性统计检测等方面均形成理论和技术的积累。经过不断探索新型超大带宽量子光源,课题组发现超亮发光二极管在噪声的量子不确定性和探测技术易实现性方面都有良好的性能;结合快速采样技术和新型数据后处理方法,实现了速率达到1012 bit/s的超高速真随机数序列的产生。研究成果通过了国际标准统计检验包和自主设计的创新型统计检验包,在国际真随机数发生器领域创造了一个纪录。

    量子真随机数发生器是利用量子现象本质的不确定性,通过对物理源的信号采集和数字化技术来输出高速超长的随机数序列。与通过算法复杂度在计算机上生成的伪随机数不同,真随机数即使在拥有无限计算资源和量子计算机的情况下,也不会被成功预测,其优良的不确定性和不可预测性在众多领域中有强烈的应用需求。

    上述工作得到国家杰出青年科学基金、国家自然科学基金重点项目和国家“863计划”项目的支持。

    最近,郭弘课题组致力于量子真随机数发生器设计研制中的细节问题,在数据后处理方法的评估、将量子贝尔不等式与随机性相结合,以及用物理方法进行随机性检验等方面做出了初步成果。(来源:北京大学信息科学技术学院)

    特别声明:本文转载仅仅是出于传播信息的需要,并不意味着代表本网站观点或证实其内容的真实性;如其他媒体、网站或个人从本网站转载使用,须保留本网站注明的“来源”,并自负版权等法律责任;作者如果不希望被转载或者联系转载稿费等事宜,请与我们接洽。

    展开全文
  • 计算机生成真随机数原理及实践经常可以听到一种痴语:计算机是有限状态机,不能产生随机数...。但实际上计算机在硬件驱动过程中是可以生成随机数的。首先看一个例子我们让电脑控制室内温度,工作情况大致是这样的,...

    计算机生成真随机数原理及实践

    经常可以听到一种痴语:计算机是有限状态机,不能产生随机数...。但实际上计算机在硬件驱动过程中是可以生成随机数的。

    首先看一个例子我们让电脑控制室内温度,工作情况大致是这样的,首先电脑要有探测温度的传感器、和控制温度的空调,电脑得到室温后和设定温度进行比较,如果温度过高则启动空调降温、过低则启动空调升温,这时室温就是以设定温度为中心的变数,从中可以提取随机数。

    我们知道电脑的显示和发声也都是属于硬件驱动,电脑通过对显卡和声卡的驱动达到显示和发声,而显卡和声卡都有自己的逻辑处理器,计算机向它们发出的指令并不是都能得到立即执行的,它们各自的处理器要根据自己的状态安排执行计算机CPU指令,所以对某些指令的执行时间是不确定的,具体表现在执行某些函数时运行时间是随机的。我们利用这种时间的不确定性就可以让计算机程序生成随机数。

    例如C++语言中的Beep(0,0),SetWindowText(NULL),MessageBeep(MB_ICONQUESTION)等,其它语言的函数也有类似情况是肯定的。

    我们只要连续调用此类函数,监测其执行时间,处理执行时间就可以达到目的。但函数的执行时间都是很短暂的,用一般测量时间的方法都太粗糙了,必须自己设计度量方法。每个计算机都有其工作频率称为主频,与之相对应的是时钟周期,做一个函数读取计算机运行以来的时钟周期,用函数运行时计算机所经历的周期数来度量时间;测量一下当前的周期数,让函数运行,再测量一下当前的周期数,两个周期数的差值再减去一个本底值就代表了函数运行时间,如此做多个循环就可以大量采集运行时间了,处理运行时间数组得到随机数组。

    且看实验数据:

    连续调用Beep(0,0)函数的运行时间115636,114283,114899,115030,114488,114350,114866,115132,114317,114757

    处理数据的方法很多这里只用最简单的方式。

    将结果放在字数组里则有  50100,48747,49363,49494,48952,48814,49330,49596,48781,49221

    放在字节数组里则有 180,107,211,86,56,174,178,188,141,69

    显然放到16位的字数组里效果不好,这是因为函数运行时间只比16位的最大值大0.7倍左右。但放到8位数组里效果不错,而其它位数的数据由此组合即可。

    通过生成大量数据的检测没有发现周期现象,也就是从不重复的,数组长度大时所有元素等概率出现随机性良好,所以它们是真随机数。在需要少量随机数的地方还是有用的,它发生简单并且不需要其它硬件。

    这里只是利用某些函数的特点来达到生成随机数的目的,因为不是专门设计制作的,所以效率不高,在主频600M的笔记本上大约达到 10k字节/s的速度。

    展开全文
  • 数学领域,随机数是指一组完全没有规律的数列,也就是说要求要有一个无因果关系的随机事件。 但在计算机中,​并没有真正意义的随机数。计算机中的随机数,都是由一个随机因子和一个复杂的随机函数产生​。 在老...

           数学领域,随机数是指一组完全没有规律的数列,也就是说要求要有一个无因果关系的随机事件。

           但在计算机中,​并没有真正意义的随机数。计算机中的随机数,都是由一个随机因子和一个复杂的随机函数产生​。

           在老版本的C++程序中,每次开始的随机因子都是相同的值,因此​重复执行程序,得到的随机数都是相同的。

    #include<iostream>
    #include<stdlib.h>
    #include<time.h>
    using namespace std;
    ​
    ​
    int main()
    {
        cout<< rand()<<endl;
    }

    ​执行结果:

    来源:(公众号:头发头发等等我)

           在后续版本的C++中,已经修正了这种操作​。在Python等其他语言中,每次在程序启动时执行random函数,结果也不相同​。

           但是无论是那种修复,都无法获得真正的随机函数​。只能是更加接近我们需求的“完全随机”​。

           因此,C++提供一个srand方法,用来重置随机因子​。一般情况下,我们使用时间戳来​填充随机因子。

           srand(unsigned(time(0)))

    #include<iostream>
    #include<stdlib.h>
    #include<time.h>
    using namespace std;
    ​
    ​
    int main()
    {
        srand(time(0));
        cout<< rand()<<endl;
    }

    ​执行结果:

         来源:(公众号:头发头发等等我)

         在实际使用中,使用当时的时间戳已经可以得到较为接近的“随机数”​。已经基本可以满足大多数程序的使用。

          但是这种随机数的随机因子,是当时的时间戳​。但是当时的时间戳是很容易被捕获到的,这并不是一个非常优秀的方法​。历史上,计算机中随机数的发展,也确实​复杂坎坷。

    伪随机数生成器(PRNG)

           伪随机数生成器是由冯诺依曼在 1946 年创造的。他的基本思想是从一个随机数种子开始,对其平方,然后取中间值。接下来重复对得到的数取平方并取中间值的过程,就会得到一个具有统计意义属性的随机数序列了。这也就是广为人知的平方取中法

           然而,冯诺依曼的方法并没有经得住时间的考验,因为不论从什么随机种子开始,序列最终都会落入某个短循环序列,比如:8100,6100,4100,8100,6100,4100……。序列中的数字是依赖于前一个数字的这种生成函数,上面的重复循环问题是不可避免的。

           在 1999 年,随机数市场发生了一个巨大的变化,Intel 在其 i810 芯片组上集成了芯片级的随机数生成器。这样使得新的服务器都自带热噪声的本地源随机数生成能力——真正的随机数生成器(TRNG)。这很伟大,但是它始终没有软件 PRNG 快,所以加密软件依旧不得不依赖于伪随机数生成器(PRNG)。

     

    展开全文
  • 一、手动产生随机数方法计数器是精密器件不能直接产生随机数,但可以让其为产生随机数服务。每个计算机都有其工作频率称为主频,与之相对应的是时钟周期,下面的程序段DWORD n;_asm//嵌入汇编语言{rdtsc//读计数器值...

    一、手动产生随机数方法

    计数器是精密器件不能直接产生随机数,但可以让其为产生随机数服务。每个计算机都有其工作频率称为主频,与之相对应的是时钟周期,下面的程序段

    DWORD n;

    _asm//嵌入汇编语言

    {

    rdtsc//读计数器值

    mov n,eax//计数器低位值进入n

    }

    的作用是读取自开机以来CPU经历的时钟周期数的低32位数值(高位值变化缓慢在此无用)放到变量 n中,每调用一次 n的数值等于其现有数值加上一个增量得到一个和,如果和超过了n的值域则溢出部分放到 n里,实际上是n中的数值是 rdtsc%N,这里用rdtsc表式计数器的值,N表示n的值域也就是2的32次方,%N表示以N为模做模运算。例如主频是2.2GHz,也就是 n的数值每秒增加2.2G,n是DWORD变量取值范围是4.29G,4.29G除以2.2G得到1.95秒,也就是说每过1.95秒 n数值能变化4.29G,小于这个时间间隔读到得可能是相近的数,极端的例子是可能读到相同的数,所以用大于1.95秒的速度读计数器才能得到0到4.29G之间的任何数值,称这个时间间隔是该值域对应的最小时间间隔。可以看到如果我们手动控制以大于1.95秒的时间间隔读取 n的数值,我们将得到4.29G范围内随机数,人为手动控制本身就是随机事件,因为人不具备控制等间隔时间的能力,间隔时间肯定是变化的、不可控制的所以能得到随机数。1.95秒多的时间产生一个随机数未免太慢了,主频一定时,采样时间间隔小时可以产生较小的随机数,关系很简单

    最小时间间隔 = 随机数值域/主频

    例如主频还是上面的2.2GHz,让 n是WORD型变量,可以算出最小时间间隔等于29.8微秒,如果 n是BYTE型变量,所需间隔0.12微秒。根据自己的需要选择即可。但是如果需要大随机数,用小的合成大的比直接产生大的效率要高得多。

    设置一个按钮,依照上面方法,让程序实现点击按钮产生一个随机数即可做成手动生成随机数的程序。此外还有保存、显示等问题就不多说了都是很简单的。

    二、自动产生随机数方法   我们知道计算机是多任务系统,往往几十个任务同时执行,由于采用了分配时间片的方式处理各个任务,还要应付突发的中断处理等,所以对较复杂的任务很难在相同的时间内完成,这是个普遍现象,利用这个特点我们就可以得到随机数。只要用大于最小时间间隔的变化时间的时间间隔读计数器的数值就可以自动获得随机数。且看下面的例子。  这是调用函数Beep(0,0)所需时间的试验(单位秒,这是在一个CPU是4000+的兼容机做的实验,使用VC++编制的小程序)0.0001883,0.0001872,0.0001866,0.0001869,0.0001844,0.0001863,0.0001889,0.0001858,0.0001855,0.0001891  平均值 0.0001869  最大值 0.0001891  最小值 0.0001844  可以看到函数运行所需时间是变化的,围绕一个中心值上下起伏,如果以此时间间隔读取计数器的值,生成TYPE型数组就是随机的,时间间隔远远大于生成TYPE的最小时间间隔。下面的程序放到VC++按钮函数里可直接运行,产生并显示100个BYTE型随机数。BYTE *str;//定义数组指针int i=0;int NN=100;//数组长度 DWORD n;str = new BYTE[NN];//借用内存for(i=0;i

    展开全文
  • 在翻阅Linux内核方面的书时发现了一个获取真随机数的方法。linux内核将机器的物理硬件产生的噪声等(例如发生的键盘敲击,中断次数,频率,温度等等)放入系统的熵池/dev/random 和/dev/urandom 中放的就是熵池中的...
  • 这篇文章主要介绍了PHP的伪随机数与真随机数详解,本文首先讲解了真随机数和伪随机数的相关概念,并给出了比用mt_rand()函数产生更好的伪随机数的一段例子代码,需要的朋友可以参考下首先需要声明的是,计算机不会产生...
  • 首先,c++11提供了random_device,这东西比srand(time(NULL))好用多了,能很高频的出随机数。 #define random(min,max) (rand()%(max-min+1))+min #include <random> #include <stdlib.h> int main(){ ...
  • C语言真正获取随机数

    2021-05-22 18:46:15
    问题1:怎样获得一个真正的随机数?要知道,rand()是不能产生真正的随机数的!即使不能产生真正的随机数,也要大概接近呀!而rand()好象每次的随机都一样。专家解答:之所以rand()每次的随机数都一样是因为rand()函数...
  • 计算机理论上可以产生统计意义上的真随机数。首先,「随机」也有不同的含义, 真正的随机目测只有量子力学了……一般的所谓随机不是指这个,而是指统计意义上的随机,也就是具备不确定性,可以被安全的用于...
  • 该方法可以用来生成一个0,1之间的一个随机数,我们可以利用该随机数来生成任意范围内的整数随机数。 function randomInt(start, end){ //这里的end-start 表示可以取到的范围有几个值,这里就不包括end。如...
  • 我们可以在用户空间通过read系统调用读这两个设备文件以此获取随机数。这两个设备文件的区别在于:如果内核熵池的估计值为0时, /dev/random将被阻塞,而/dev/urandom不会有这个限制。 #include #include #include #...
  • 我创造了一个真正的随机数发生器。这需要Python随机.randint并使用它生成随机数。这并不是真正的随机性,所以第二个代码基本上是试图得到数字,只有当0的数量等于1的数量,1的数量等于2的数量,等等。。我的问题是它...
  • 真随机数发生器(TRNG) 真随机数发生器会生成几乎无法预测的随机数,因为影响结果值变化的因素是物理环境的特征。例如,掷骰子将生成难以预测的随机值。但是骰子的数量限制为1到6。因此,几乎很难预测生成随机数,...
  • C/C++怎么生成“真正的”随机数

    千次阅读 2021-05-24 01:44:18
    C/C++怎么生成“真正的”随机数C语言中,直接用rand()函数生成随机数的话,会出现一个尴尬的局面,那就是每次运行都会生成相同的一个数,这显然不能满足我们的期望。怎么回事呢?不管从哲学上说,还是从技术上说,都...
  • Java的随机数生成方式

    2021-03-07 04:26:57
    即种子用于随机数生成器初始化值,随机生成器对于特定的种子值总是产生相同的随机数序列。 一般Random random = new Random();系统采取当前时间毫秒数做种子数做到随机不然的话写了种子数随机数就是定值了。 而...
  • golang之真伪随机数

    2021-09-29 09:33:21
    golang之真伪随机数伪随机数真随机数伪随机数导致的问题 伪随机数 import ( "math/rand" "fmt" ) func main(){ rand.Seed(1) fmt.Println(rand.Intn(20)) fmt.Println(rand.Intn(20)) fmt.Println(rand.Intn...
  • 先说结论:不止Python的random内置模块,还包括numpy的随机抽样子模块random,以及其他编程语言的随机数生成器,例如java.Math.Random()函数,所有这些随机数生成器生成的随机数都不是真正的随机数,而是伪随机数。
  • 库中的random_device()函数可以产生真随机数,rand()函数用的线性同余法生成随机数,但是这个随机数实际上是一个伪随机数。 先说结论:windows下别用mingw-gcc,它的random_device()不能产生真随机数。MSVC就可以。 ...
  • } 产生n个随机数 #include #include #include #include #include using namespace std; void InsertSort(int a[], int n) { for (int i = 1; i> num; cout 随机数组:"; for (int i = 0; i ; i++) { ranNum[i] = ...
  • 文章目录1、概述2、名词解释3、随机数存在的安全风险3.1 弱伪随机数带来的安全风险3.2 真随机数真的安全吗4、随机数4.1 什么情况下才使用随机数4.2 伪随机数4.2.1 弱伪随机数4.2.2 强伪随机数4.3 真随机数4.4 安全...
  • `9 Y) n7 _7 N5 G1 K( Q随机数序列在数值分析和概率统计中占有非常重要的地位,因为使用蒙特卡罗模拟方法的前提就是要求很多足够多的,真正的随机数。matlab是基于某种算法,通过rand函数来产生随机数的。从随机数...
  • # 随机数### c随机数~~~std::srand(std::time(nullptr));int randomValue = std::rand();~~~![](data:image/gif;base64,R0lGODlhAQABAPABAP///wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==)### c++随机数~~~1. 非确定...
  • python 实现随机数

    2021-04-10 17:30:45
    Python3实现随机数,供大家参考,具体内容如下 random是用于生成随机数的,我们可以利用它随机生成数字或者选择字符串。 random.seed(x)改变随机数生成器的种子seed。 一般不必特别去设定seed,Python会自动选择seed...
  • QT产生随机数

    2021-11-27 16:36:00
    使用QT的QTime库产生随机数,代码如下 #include <QTime> QTime randtime; randtime = QTime::currentTime(); qsrand(randtime.msec()+randtime.second()*1000); //以当前时间ms为随机种子 int n = ...
  • I'm learning random module of python. And I know it generates pseudo random number. Which its core idea is to use a high-frequency clock as a seed and then use a function to produce a 'looking-like ra...
  • arduino获取随机数

    2021-11-18 19:53:25
    使用 random()函数来生成随机数,返回 long型 random()函数有两种使用使用方法 random(max); //返回数类型不会 超过所填的数据 random(min,max); //产生一个范围内的随机数 使用示例 void setup() { Serial.begin...
  • 绝对的随机-真随机数生成真随机数顾名思义就是生成数据是真正随机的,达到真随机数的生成只有依靠外界的物理现象,比如,计算机可以在其内部进行一个个原子衰变,根据量子物理学,这个衰变是完全随机的,这样,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 435,973
精华内容 174,389
关键字:

真随机数