真正的随机数ran()之我见

最近做一个游戏的项目,需要用到随机数来闯关。我们讲的随机数其实暗指伪随机数。不少朋友可能想到C语言的rand(),可惜这个函数产生的随机数随机性非常差,而且速度很慢,相信几乎不能胜任一般的应用。资深的程序员都知道,rand其实就是一个算法,是一个固定的数字序列。每次开机到N次后的数据是有公式算出来的。所以并不适合用在游戏或者加密的场合。而且我们做游戏机的一般都是用单片机来做,一个独立的单片机系统要生成一个大的随机数是不可能的,重复的概率非常高,永远不能实现随机的效果。很多人想到用复杂的运算公式,其实最本质的问题是,无论多复杂的运算,都是死的公式,都能被推算出来,这就并非真正意义上的真随机数了。

那什么是真正的随机数呢?很多人会立刻说当然是永远都不会有重复的数。我的观点是否认的!为什么呢?我的理解真正的随机数必需具备2个条件。1:要有一定的离散性。2:不能用数学公式和模型来推导。所以重不重复或者多大才重复这些是必需条件但并不是必要条件。想想我们现实生活中很多偶然事件,很多意外都是一个随机的事件,但也是会有重复,所以我们不要一味追求要万分之一,或者亿份之一的重复概率,我们只要求它是离散的,不是数学公式合成的就行了,当然它的重复概率越高那更好不过。

那现实中什么是随机性的呢?客观时间的温度,时间,电压,压力,音频这些都不能人为产生或公式来算的,我们就叫真正意义上的随机,我们不排除它有一定的重复性,但它也必须要保证它有一定的离散性和重复率,当然它最重要的前提是要保证不能用公式来推导。

居于以上现实世界的随机模式,如果我们要在单片机系统中取到真正的随机数,我们可以加入一个时钟芯片,一个温度传感,一个AD转换。然后用一个足够长的浮点运算来产生随机数。这样才是我们真正需要的随机数。不过要在原系统上面增加这么多的传感器,还要进行浮点运算,这会非常影响原系统的资源分配以及硬件成本。所以找一个专业的随机数芯片就能一次过解决这些问题了。

在百度中我找到了这个型号的芯片,ZW20U8和ZW20U6这个已经集成了上面的芯片,而且里面固化了LGC和Mersenne twister算法。是骡子是马,我们得要拉出来遛一遛,为了测试其的效果,我专门弄了一个测试工具,测试效果可以看视频。

http://v.youku.com/v_show/id_XMzUwMzg5NjA4OA==.html?spm=a2h3j.8428770.3416059.1


我让它连续工作了一天,也没有发现其重复的数,最重要的是每次开机,生成的数列是完全不一样的。接口也简单,分I2C和UART。每次去数就发一个命令,非常简单,不会占用原系统的资源。

现在我的项目量产了,基本的效果还是很不错,这个芯片成本好像也不贵,可以用在游戏,加密,通讯等领域,好东西跟大家一起分享。


发布了21 篇原创文章 · 获赞 12 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/fgh00000/article/details/79764596