一种软件生成真随机数算法的设计和实现(1)(2)
2015-05-15 01:30
导读:对于进一步的组合处理,我们要慎重的选择。如果选择的好,可以进一步的增加序列的随机性,从而可以降低对原始随机数序列采集的要求。但是,特别值
对于进一步的组合处理,我们要慎重的选择。如果选择的好,可以进一步的增加序列的随机性,从而可以降低对原始随机数序列采集的要求。但是,特别值得注意的是,如果选择的组合算法存在缺陷,反而有可能降低原始随机数序列的随机性。极端的情况是,比如组合算法生成的结果都是0组成的序列。
4 具体实现
我们选择这样的一种随机事件,当用户拿着鼠标在计算机屏幕上随意滑动时,鼠标滑动的轨迹组成的一条曲线是随机的。也就是说,即使同一个用户也不可能划出这样一条完全一致的曲线。这种方式很类似于我们投掷硬币的方式。就像古希腊一位哲人所说,人生不可能两次踏入同一条河流。
基于上述的随机事件的选择,我们在一定的时间内对这条曲线进行时间的抽样。如果要求生成N bit的01序列,那么我们就对这段曲线进行时间间隔为1/N的取样。这样,我们就会得到N个取样点,每个取样点用其在计算机屏幕上的坐标来表示。接着对每个取样点的横坐标和纵坐标进行相加,取不大于坐标和的最大整数。如果得到的整数是偶数,那么这个取样点就表示为0;如果得到的整数是奇数,那么这个取样点就表示为1。这样,我们最后得到了由0和1组成的随机数序列。假设,我们得到的随机数序列可以表示为:
Seed [i],其中(i=0,1,…N-1)
然后,我们对得到的随机数序列进行进一步的处理,组成组合随机数生成器,从而进一步增强序列的随机性。
我们使用线性同余法对原始随机数序列进行进一步处理,从而得到新的组合随机数序列。我们使用线性同余法得到N个位于[0,N-1]之间的随机数,它可以表示为:
A [j],其中(j=0,1,…N-1),( A [j]的取值在[0,N-1]).
数组A [j]的含义如下:数组下标j表示组合后的随机数序列的第j个位置,数组的值A [j]表示组合后的随机数序列第j个位置的值从原始随机数序列Seed 中A [j]位置取值。
(科教作文网http://zw.NSEaC.com编辑发布)
如果得到的随机数序列A [j] 没有重复值,也就是满足:A [j] = A [k],当且仅当 j = k 。
那么得到的组合随机数序列为:
Seed [ A [0] ],Seed [ A [1] ],Seed [ A [2] ],…Seed [ A [N-1] ].
如果得到的随机数序列A [j] 有重复值,比如A [6] = A [23] = N/2。
假设出现A [j] = A [k](j