日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

在计算机上采用线性同余法,随机数生成算法 —— 线性同余法

發布時間:2024/8/1 编程问答 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在计算机上采用线性同余法,随机数生成算法 —— 线性同余法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

最近在做幀同步的實時對戰,要自己接管隨機數的產生,所以看了一下隨機數生成的相關算法。因為游戲會跑在不同平臺(iOS/Android)及不同硬件上,所以使用的算法有以下的要求:1. 不能依賴系統;2. 不能依賴硬件;3. 計算中不能使用浮點數(不同平臺不同硬件有可能結果不同)。再結合效率方面的考慮,最終選擇采用了線性同余算法,并在基礎上做了一定的加強。這篇博客主要記錄關于這個線性同余算法產生隨機數的一些思考。

首先要搞清楚隨機數的定義,真正的隨機數都不是計算出來的,這里我們說的隨機數其實都是偽隨機數,隨機數偽隨機數的定義,具體的論證等資料可以自行查閱。產生偽隨機數的算法有很多種,線性同余算法基于整數的加、乘和求模,算法簡單但是具有較強的規律性與周期性。怎么在這個基礎上盡量降低規律性與周期性,使得在更廣范圍內覆蓋更多可能就是我們的目標。

首先要了解的是線性同余函數公式,最終結果受乘數λ,加數C和模數M決定。M通常我們會使用一個較大的素數,而λ,C的選取在很大程度上會影響生成的隨機數的質量。我們嘗試使用不同的λ與C去生成一系列的隨機數并觀察他們。為了直觀感受一些列的隨機數是否足夠隨機,我們用這些數字作為X,Y填充一張1024 * 512的位圖,觀察圖上的點的位置,可以得知這一系列隨機數在1024 * 512范圍內隨機分布的情況。

使用最基礎的線性同余公式生成的隨機數,因乘數λ、加數C參數不同,有的時候比較隨機(圖一),有的時候呈現出比較強的規律性(圖二),但周期性都是十分短。在多次嘗試中能成功填充的點從幾千到幾萬個,但并不能完全填充整張圖,證明周期性在1024*512種組合中都無法確保不重復。這樣的隨機數算法顯然是不夠好的。要在線性同余算法的基礎上加強,首先想到的是計算Xn時,不再只用Xn-1參與,而是用X1到Xn-1的加和。

使用加和版本的線性同余算法,套用不同的參數λ、C再次生成隨機數填充位圖觀察:

可以看出加和版本的線性同余算法產生的隨機數,因乘數λ、加數C參數不同,有的時候呈現出比較強的規律性(圖三),有的時候比較隨機(圖四)。數量上從10w到50w不等,大部分情況無法覆蓋1024*512種情況,極少數情況下能完全覆蓋。選取一組較好的λ,C參數,使用加和版本的線性同余算法產生的隨機數其實已經可以滿足游戲功能的需求了,如果還想加再優化,則要從參數λ,C的變化入手。

在多次測量的過程中,用不同的參數λ,C能得出不同的表現,那只要λ,C不再取固定值,就相當于混合了使用多個加和線性同余算法生成結果的混合來做隨機數。這樣做即使一組λ,C生成的隨機數有一定的周期性與規律性,但混用多組結果,就能把周期性與規律性再次降低(但無法消除)。

那么如何給λ,C動態取值呢。方法有兩種:

第一種是預先生成一張素數表,讓λ,C在這張表中循環取值,這種方式λ,C之間沒有規律性(素數性質),但周期性的大小就取決于這張素數表的大小,通常而言不會有太多組變化,預生成的表最多也就是幾百個。

第二種方式就是λ,C也動態計算得出。這樣做其實問題就回到最初的原點,如何使用代碼動態生成隨機數然后盡量讓這些數字的規律性與周期性盡量低。通過上面的分析已經知道,如果λ,C也使用代碼生成的話,在周期性上比方法一有更大的優勢(選取較好的λ,C可以在1024*512區間內就有幾十萬種組合,參考圖四),但規律性上沒有方法一好。

無論是采用方法一還是方法二,本質上都是在混用多個(有限個)線性同余公式的結果,所以一定還是會有周期性與規律性的問題。方法一優勢在于規律性非常低,但素數表的大小決定了周期性大小,通常做不到太多變化,而且占用內存。方法二λ,C組合非常多,不需要額外內存,但要額外計算,并且這些λ,C是會有一定的規律性的,優勢是周期性非常長,但規律性上沒有方法一好的。

其實對于游戲邏輯而言,采用固定λ,C的加和線性同模產生的隨機數已經足夠了,效率還會比較高。但如果想做一個質量很高的隨機數生成器,個人建議是采用方法一,然后預先打出一萬以內的素數作為λ,C組合使用,這樣的λ,C組合已經有上百萬種了,混用一百萬個加和版本的線性同余算法來生成隨機數的話,規律性與隨機性方面應該都能滿足計算機領域的使用了。

最后有幾點值得注意的是:

一、計算時使用int或int64,有符號或無符號,對于隨機數的生成都會有很大影響,計算時要注意

二、如果λ,C 較小而M 非常大,在初期會出現連續的遞增情況,這三個參數的選取要注意。

總結

以上是生活随笔為你收集整理的在计算机上采用线性同余法,随机数生成算法 —— 线性同余法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。