真正的隨機數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。每次去數就發一個命令,非常簡單,不會佔用原系統的資源。

現在我的項目量產了,基本的效果還是很不錯,這個芯片成本好像也不貴,可以用在遊戲,加密,通訊等領域,好東西跟大家一起分享。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章