本发明涉及随机数生成技术领域,具体的说是一种真随机数生成方法。
背景技术:
目前,为了完成某些特定的任务或实现特定的功能,一些应用程序在运行的过程中需要生成随机数。例如,某些应用程序为了降低恶意访问用户身份的风险,在用户身份验证时需要生成动态的随机密码或随机验证码提供给用户,这些随机密码和随机验证码需要由随机数来确定。又如,为了更好地贴合现实场景,对于现实场景中某些随机出现的资源,某些应用程序在用户使用时也需要随机提供这些资源,这些资源的种类、数量等需要由生成的随机数来确定。
现有技术中,生成随机数大都是利用软件算法进行生成,目前主流的计算机软件开发语言都提供有生成随机数的方法,例如c语言的程序开发中,普遍使用的是基于rand()方法获得的随机数,然而rand()方法获得的随机数存在序列固定的问题,即对于某一时刻的随机数,其下一次调用rand()方法生成的随机数是固定并且与上一时刻的随机数是关联的,使用其他地软件语言也有同样的问题存在,目前的已有的解决方案是在使用随机数生成命令之前将随机数生成命令内部的随机因子打乱,打乱的方式是将随机因子赋为当前的系统时间,来保证生成结果的随机性。而该方法的弊端在于如果在生成随机数频率非常高的情况下,可能出现由于时间度量单位不够小出现的多个基于时间的随机因子一样的情况,该情况会导致生成的随机数一样。
技术实现要素:
为了解决现有技术中的不足,本发明提供一种真随机数生成方法,引入外部随机事件执行装置,确保随机数生成过程完全是随机的,从而生成真随机数。
为了实现上述目的,本发明采用的具体方案为:
一种真随机数生成方法,用到一种生成装置,生成装置包括随机系统和生成系统;随机系统包括闭环连接的处理模块、事件执行模块和计时模块,生成系统包括闭环连接的数值拆分模块、0/1生成模块和存储模块,其中数值拆分模块和0/1生成模块均与处理模块相连接;具体的生成步骤如下:
s1、数值拆分模块根据随机数的上界b1和下界b2计算界差b,b=b1-b2;
s2、数值拆分模块对b进行拆分,
s3、数值拆分模块将k0、k1、k2、……、kn传输给0/1生成模块,0/1生成模块生成(n+1)个存储区,每个存储区分别有(k0+1)、(k1+1)、(k2+1)、……、(kn+1)个数位,存储区生成完毕后向存储模块申请(n+1)个内存地址块,记为address0,address1,address2,……,addressn;其中address0大小为k0个字节,address1大小为k1个字节,依次类推;
s4、数值拆分模块传输给处理模块一个临界值l生成信号;
s5、处理模块接受到临界值l生成信号后开始生成临界值l,具体的生成步骤包括:
t1、处理模块提出一个事件e并设定执行次数,然后将事件e和执行次数传输给事件执行模块;
t2、事件执行模块接收到处理模块提出的事件e并按执行次数逐次执行;
t3、处理模块利用计时模块采集事件执行模块每次执行事件e消耗的时间;
t4、处理模块计算所有执行时间的均值,该均值即为临界值l;
s6、处理模块将生成的临界值l传输给数值拆分模块;
s7、数值拆分模块给处理模块传输一个临界值l生成信号和叠加参数t,同时将临界值l传输给0/1生成模块;
s8、处理装置接收到随机量生成信号后将所述事件e传输给事件执行模块并设定执行次数为t;
s9、事件执行模块执行t次事件e,并返回给处理模块t个执行时间t;
s10、处理模块将t个执行时间t传输给0/1生成模块,0/1生成模块将执行时间t和临界值l进行对比,根据对比结果产生一个0或1,具体步骤包括:
p1、0/1生成模块将执行时间t和临界值l相比较,如果执行时间t大于临界值l,则输出1,否则输出0;
p2、0/1生成模块将生成的0或1传输给存储装置;
s11、存储装置根据s3中生成的内存地址块,对于每一个内存地址块进行以下操作:
q1、对于内存地址块中的每一个字节bi,
q2、使用0/1生成装置传输过来的0或1依次替换bi,使每个内存地址块内存储一个二进制数;
s12、数值拆分模块读取内存地址块address0,address1,address2,……,addressn中的二进制数,并将其转化为十进制数值,对应为d0,d1,d2,……,dn;
s13、数值拆分模块将d0,d1,d2,……,dn求和记为d,计算d和b的余数c,将c+b1作为结果并输出。
优选地,所述步骤t3中,计时模块采集事件执行模块每次执行事件e消耗的时间的具体步骤为:
m1、处理模块首先利用计时模块获得当前时间t1,
m2、处理模块将事件e交付为事件执行模块,等待其运行完成,
m3、事件执行模块完成事件e后,处理模块从计时模块中获得当前时间t2,
m4、将t2和t1相减,获得时间差t3,时间差t3即为事件执行模块单次执行事件e消耗的时间。
有益效果:本发明引入外部随机事件发生装置,根据随机事件发生的概率对应生成0或1,进而合并成若干位的二进制数,从而确保能够在完全随机的条件下生成真随机数,而且根据使用环境不同,能够灵活选择不同的随机系统,以满足不同的使用需求。
附图说明
图1是生成装置示意图。
具体实施方式
下面根据附图具体说明本发明的实施方式。
一种真随机数生成方法,用到如图1所示的一种生成装置,生成装置包括随机系统和生成系统;随机系统包括闭环连接的处理模块、事件执行模块和计时模块,生成系统包括闭环连接的数值拆分模块、0/1生成模块和存储模块,其中数值拆分模块和0/1生成模块均与处理模块相连接;具体的生成步骤如下:
s1、数值拆分模块根据随机数的上界b1和下界b2计算界差b,b=b1-b2;
s2、数值拆分模块对b进行拆分,
s3、数值拆分模块将k0、k1、k2、……、kn传输给0/1生成模块,0/1生成模块生成(n+1)个存储区,每个存储区分别有(k0+1)、(k1+1)、(k2+1)、……、(kn+1)个数位,存储区生成完毕后向存储模块申请(n+1)个内存地址块,记为address0,address1,address2,……,addressn;其中address0大小为k0个字节,address1大小为k1个字节,依次类推;
s4、数值拆分模块传输给处理模块一个临界值l生成信号;
s5、处理模块接受到临界值l生成信号后开始生成临界值l,具体的生成步骤包括:
t1、处理模块提出一个事件e并设定执行次数,然后将事件e和执行次数传输给事件执行模块;
t2、事件执行模块接收到处理模块提出的事件e并按执行次数逐次执行;
t3、处理模块利用计时模块采集事件执行模块每次执行事件e消耗的时间;
t4、处理模块计算所有执行时间的均值,该均值即为临界值l;
s6、处理模块将生成的临界值l传输给数值拆分模块;
s7、数值拆分模块给处理模块传输一个临界值l生成信号和叠加参数t,同时将临界值l传输给0/1生成模块;
s8、处理装置接收到随机量生成信号后将所述事件e传输给事件执行模块并设定执行次数为t;
s9、事件执行模块执行t次事件e,并返回给处理模块t个执行时间t;
s10、处理模块将t个执行时间t传输给0/1生成模块,0/1生成模块将执行时间t和临界值l进行对比,根据对比结果产生一个0或1,具体步骤包括:
p1、0/1生成模块将执行时间t和临界值l相比较,如果执行时间t大于临界值l,则输出1,否则输出0;
p2、0/1生成模块将生成的0或1传输给存储装置;
s11、存储装置根据s3中生成的内存地址块,对于每一个内存地址块进行以下操作:
q1、对于内存地址块中的每一个字节bi,
q2、使用0/1生成装置传输过来的0或1依次替换bi,使每个内存地址块内存储一个二进制数;
s12、数值拆分模块读取内存地址块address0,address1,address2,……,addressn中的二进制数,并将其转化为十进制数值,对应为d0,d1,d2,……,dn;
s13、数值拆分模块将d0,d1,d2,……,dn求和记为d,计算d和b的余数c,将c+b1作为结果
优选地,所述步骤t3中,计时模块采集事件执行模块每次执行事件e消耗的时间的具体步骤为:
m1、处理模块首先利用计时模块获得当前时间t1,
m2、处理模块将事件e交付为事件执行模块,等待其运行完成,
m3、事件执行模块完成事件e后,处理模块从计时模块中获得当前时间t2,
m4、将t2和t1相减,获得时间差t3,时间差t3即为事件执行模块单次执行事件e消耗的时间。
优选地,处理模块、0/1生成模块和数值拆分模块均为8086单片机,为方便叙述,处理模块记为第一8086单片机,0/1生成模块记为第二8086单片机,数值拆分模块记为第三8086单片机;事件执行模块包括脉冲发射器和脉冲接收器;计时模块为微控制器lpc54100;存储模块为6264内存。
以生成1-45之间的随机数为例,具体的生成步骤如下:
s1、第三8086单片机的8086单片机通过i/o接口接收到随机数的上界b1=45和下界b2=1,然后计算界差b=b1-b2=44;
s2、第三8086单片机对b进行拆分,有44=22+23+25,并计算叠加参数t=2+3+5+(2+1)=13;
s3、第三8086单片机将2、3、5传输给第二8086单片机,第二8086单片机生成三个存储区,每个存储区分别有3、4、6个数位,存储区生成完毕后向6264内存申请三个内存地址块,记为
address0,address1,address2;其中address0大小为3个字节,address1大小为4个字节,address2为6和字节;
s4、第三8086单片机传输给第一8086单片机一个临界值l生成信号;
s5、第一8086单片机接受到临界值l生成信号后开始生成临界值l,具体的生成步骤包括:
t1、第一8086单片机提出一个事件e并设定执行次数,然后将事件e和执行次数传输给事件执行模块,设定事件e为由脉冲发射器发射一个脉冲信号并由脉冲接收器接收该脉冲信号,执行次数为100次;
t2、事件执行模块接收到第一8086单片机提出的事件e并由脉冲发射器和脉冲接收器配合执行100次;
t3、第一8086单片机利用微处理器lpc54110采集事件执行模块每次执行事件e消耗的时间具体的过程为在脉冲发射器发射脉冲信号时第一8086单片机读取微处理器lpc54110的cpu时钟t1并存入到6264内存中,脉冲接收器接受到脉冲信号时第一8086单片机读取微处理器lpc54110的cpu时钟t2并存入到6264内存中,然后第一8086单片机计算t3=t2-t1即得到事件执行模块单次执行事件e所用的时间,可以看出计时模块返回给第一8086单片机的是cpu时钟,因此计时模块的cpu时钟频率越高越好,这里计时模块选用双核心的微处理器lpc54110,在其他的实施方式中可以有其他频率更高的处理器替代;
t4、第一8086单片机计算所有执行时间的均值,该均值即为临界值l;
s6、第一8086单片机将生成的临界值l传输给第三8086单片机;
s7、第三8086单片机给第一8086单片机传输一个临界值l生成信号和叠加参数t,同时将临界值l传输给第二8086单片机;
s8、第一8086单片机接收到随机量生成信号后将所述事件e传输给事件执行模块并设定执行次数为t;
s9、事件执行模块执行t次事件e;
s10、第二8086单片机根据每次执行事件e的时间和临界值l,产生一个0或1,具体步骤包括:
p1、第二8086单片机将执行时间t和临界值l相比较,如果执行时间t大于临界值l,则输出1,否则输出0;
p2、第二8086单片机将生成的0或1传输给6264内存,假定最终传输给6264内存的0或1依次是1011100110101;
s11、6264内存根据s3中生成的内存地址块,对于每一个内存地址块进行以下操作:
q1、对于内存地址块中的每一个字节bi,
q2、使用第二8086单片机传输过来的0或1依次替换bi,使每个内存地址块内存储一个二进制数,三个内存地址块内的二进制数分别是101、1100、110101;
s12、第三8086单片机读取内存地址块address0,address1,address2中的二进制数,并将其转化为十进制数值,对应为d0,d1,d2,值分别是5、12和53,
s13、第三8086单片机将d0,d1,d2求和记为d=70,计算d和b的余数c=26,将c+b1=26+1=27作为结果并输出。
以上实施例仅用以说明而非限定本发明的技术方案,尽管参照上述实施例对本发明进行了详细说明,本领域的普通技术人员应当理解;依然可以对本发明进行修改或者等同替换,而不脱离本发明的精神和范围的任何修改或局部替换,其均应涵盖在本发明的权利要求范围当中。