最近做一个游戏的项目,需要用到随机数来闯关。我们讲的随机数其实暗指伪随机数。不少朋友可能想到C语言的rand(),可惜这个函数产生的随机数随机性非常差,而且速度很慢,相信几乎不能胜任一般的应用。资深的程序员都知道,rand其实就是一个算法,是一个固定的数字序列。只要最初输入的数值(初值)不变,那么输出的值都会是同一个值,这就证明了这个数并不随机,只是看起来随机而已。。所以并不适合用在游戏或者加密的场合。而且我们做游戏机的一般都是用单片机来做,一个独立的单片机系统要生成一个大的随机数是不可能的,重复的概率非常高,永远不能实现随机的效果。很多人想到用复杂的运算公式,其实最本质的问题是,无论多复杂的运算,都是死的公式,都能被推算出来,这就并非真正意义上的真随机数了。换句话说,只要这个随机数是由确定算法生成的,那就是赝随机数。
那什么是真正的随机数呢?很多人会立刻说当然是永远都不会有重复的数。我的观点是否认的!为什么呢?我的理解真正的随机数必需具备2个条件。1:要有一定的离散性。2:不能用数学公式和模型来推导。所以重不重复或者多大才重复这些是必需条件但并不是必要条件。想想我们现实生活中很多偶然事件,很多意外都是一个随机的事件,但也是会有重复,所以我们不要一味追求要万分之一,或者亿份之一的重复概率,我们只要求它是离散的,不是数学公式合成的就行了,当然它的重复概率越高那更好不过。
那现实中什么是随机性的呢?客观时间的温度,时间,电压,压力,音频这些都不能人为产生或公式来算的,我们就叫真正意义上的随机,我们不排除它有一定的重复性,但它也必须要保证它有一定的离散性和重复率,当然它最重要的前提是要保证不能用公式来推导。
我们用更通俗的语言来说说。
真随机:有一天,小明在的班级上举办了一次抽奖活动。这个班级有40个学生,所以为了公平起见,保证每个学生都有1/40的几率中奖,老师准备了40个相同的纸盒,每个纸盒中都有40张纸条,有1张纸条是中奖纸条。这样一来,每个学生都有1/40的几率中奖,但每个学生是否中奖并不受其他学生的影响。在极端情况下,这个班上可能40个学生都能中奖。这就是真随机。
伪随机:小明班上举办了抽奖活动。为了公平起见,老师准备了1个纸盒,纸盒中有40张纸条