当前位置 :
真随机数的定义是什么
更新时间: 2025-08-27 02:17:39
1人问答
问题描述:

真随机数的定义是什么

黄善钧回答:
  从软件的角度来说,如果是计算机起卦,则要用到随机数,而电脑中的随机数是假的随机数,搞那么多年程序,我还没看到过什么玩意能够有真随机数,按现代科学定义的真随机数的产生条件有起码两个:   1、真随机数数列是不可预计的,因而也不可能重复产生两个相同的真随机数数列.   2、真随机数只能用某些随机物理过程来产生.例如:放射性衰变、电子设备的热噪音、宇宙射线的触发时间等等.   在计算机中,为了满足信息熵的特性,常常是用到的信息源包括用户的人为反应或某种经过排列变形后的高频时钟的序列或者是用户运动鼠标的路径的坐标等,这在一般的程序里据我看是很少触及到的.因此,计算机上的起卦方法先不谈真随机数的如何的处理问题,还有取到了数又该如何变化的问题.如果更深化的话,还需要要论及世界的本质之类的哲学命题,暂且不表.就目前起卦程序主要在网上起而言,关联于时间的起卦法也许还有可商议之处,而对随机要求性较强的起卦方法是很不适合的.   1.如何产生一定范围内的随机数?   直接的方法是:   rand()%N;   返回从0到N-1的数字.但这个方法不好,因为许多随机数发生器的低位比特并不随机.一个较好的方法是:   (int)((double)rand()/((double)RAND_MAX+1)*N);   如果你不希望使用double,另一个方法是:   rand()/(RAND_MAX/N+1);   两种方法都需要知道RAND_MAX,而且假设N要远远小于RAND_MAX.ANSI规定标准头文件stdlib.h中包含RAND_MAX的#define.顺便提一下,RAND_MAX是个常数,它告诉你C库函数rand()的固定范围.你不可以设RAND_MAX为其它的值,也没有办法要求rand()返回其它范围的值.如果你用的随机数发生器返回的是0到1的浮点值,要取得范围在0到N-1内的整数,只要将随机数乘以N就可以了.   2.为什么每次执行程序,rand()都返回相同顺序的数字?   你可以调用srand()来初始化伪随机数发生器的种子,传递给srand()的值应该是真正的随机数,例如当前时间:   #include   #include   srand((unsignedint)time((time_t*)NULL));   请注意,在一个程序执行中多次调用srand()并不见得有帮助!不要为了取得“真随机数”而在每次调用rand()前都调用srand()!   3.我需要随机的真/假值,所以我用直接用rand()%2,可是我得到交替的0,1,0,1,0.   这是个低劣的伪随机数生成器,在低位比特中不随机!很不幸,某些系统就提供这样的伪随机数生成器.请试着使用高位比特,具体请参考本文第1点.
其它推荐
最新更新
热门其它
保卡通(baokatong.com)汇总了汉语字典,新华字典,成语字典,组词,词语,在线查字典,中文字典,英汉字典,在线字典,康熙字典等等,是学生查询学习资料的好帮手,是老师教学的好助手。
声明:本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
Copyright©2009-2021 保卡通 baokatong.com 版权所有