随机数芯片,从硬件上能产生真随机数,非伪随机数

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

 

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

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

我们用更通俗的语言来说说。

真随机:有一天,小明在的班级上举办了一次抽奖活动。这个班级有40个学生,所以为了公平起见,保证每个学生都有1/40的几率中奖,老师准备了40个相同的纸盒,每个纸盒中都有40张纸条,有1张纸条是中奖纸条。这样一来,每个学生都有1/40的几率中奖,但每个学生是否中奖并不受其他学生的影响。在极端情况下,这个班上可能40个学生都能中奖。这就是真随机。

伪随机:小明班上举办了抽奖活动。为了公平起见,老师准备了1个纸盒,纸盒中有40张纸条,只有1张纸条是中奖纸条。这样一来,每个学生都有1/40的几率中奖——但是显而易见,这个班上有且仅有一名学生能够中奖。一名学生在中奖后,余下的所有学生中奖几率都会减少至0。这就是伪随机。

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

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

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

 

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

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

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值