随机数无非就是些无规律的乱码,随机函数是一种用公式来生成乱码的函数,受制于发生方式它只能产生伪随机数,也就是看起来像随机数,实际有内在的规律在里面,所以随机性也受限制。 许多东西可以人造例如宝石晶体、化学合成药物,但说到真随机数则认为不能人造,必须借助于物理的随机现象来获得,这也有点太奇怪了,素材就是现成的数,剩下就是排列问题,按规律排列就不是随机数,无规律排列就是随机数。 下面我们来设法生成随机数组,它的特点类似于真随机数,并且是可以控制的。数组不能太小否则不能得出有代表性的结论,是没有意义的探索,而大些的数组是服从统计规律的。 举例说明方法,设数组的基本元素共m个,要建造长度为N的数组,k为一正整数且 km≥N≥(k-1)m 也就是在km个数据中,每种元素的数量都是k个,这样元素才有可能是均匀分布的。 为了便于计算,现在让这km个数据是有序排列的,然后让数组进行随机排序,谁来控制随机排序,方法多种多样,为简单起见选用性能比较好的MT19937这个随机函数来做,函数的种子需要设定一下,排序的次数可以灵活掌握。随机排序有抽检式和循环式的,虽然多次运行效果一样,但采用后者更好些,能保证每次循环所有数据都被交换,一般一次循环就能使数组达到相当的混乱程度,何况多次。 虽然借助于随机函数,但后者只是参与排序,不会让生成数组之间建立某种规律性联系,由于T19937的周期大于10的6000次方,可以看成是无穷大了,所以数组形成的时间复杂度和空间复杂度都可以看成无穷大。你可以通过数组初始状态、随机函数种子、随机排序次数等来全面控制数组。 从这长度为km数组中取N个,数组建造就完成了。 真随机数是个相对的概念,我建立的数组你千方百计也不能复现,也不能发现任何可利用的规律那么对你来说就是真随机数组,而对我来说却不是因为我能复现它,如果除了制作者外任何其它人都无法控制它,那就够用了。真随机数组可以认为是一种随机数的形成机制,现实中并不存在真随机数组,因为数组一经出世就不再是真随机数组了,人们有可能拷贝存储它(包括制作者),可以复现了当然就不符合真随机数定义了。真随机数组的每个成员都是独立的,跟它附近的数没有任何关系。 有了随机数组,你可以用于信息加密或建立抽奖随机号等,人造的真随机数最大的好处是可以控制,但问题也在这里,如果总是使用同样的初始条件有可能数组出现重复,这是应该杜绝的。解决办法是初始设置尽量避免人为的习惯因素,让设置也是随机的。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课