计算机随机数是如何生成的?(平分取中法、线性同余法)
計算機隨機數是如何生成的?(平分取中法、線性同余法)
- 平方取中法
- 輸出
- 統計結果1
- 統計結果2
- 線性同余法
- 輸出
- 統計結果
- 歡迎關注微信公眾號:Java后臺開發
隨機數無疑是計算機程序設計中極其重要的一個東西,無論是完成簡單的抽獎小程序還是使用蒙特卡洛方法都需要使用隨機數,而很多人每天都在使用隨機數,卻不知道隨機數是怎么生成的。
平方取中法
平方取中法是我們的計算機之父馮·諾依曼提出的。此法開始取一個2s位的整數,稱為種子,將其平方,得4s位整數(不足4s位時高位補0),然后取此4s位的中間2s位作為下一個種子數,并對此數規范化(即化成小于1的2s位的實數值),即為第一個(0,1)上的隨機數。以此類推,即可得到一系列隨機數。
它的算法公式如下
其中u代表生成的隨機數,x代表種子數
我們來看看計算機之父提出的隨機數算法效果如何,令s = 2,x = 6666,來輸出10個數看看
輸出
0.4355 0.966 0.3156 0.9603 0.2176 0.7349 0.0078 0.006 0.0036 0.0012看起來這個算法還行,我們輸出一萬個數用直方圖統計一下看看效果怎么樣
統計結果1
額。。。為什么看起來輸出的數字全在0.0-0.05這個區間上
把所有數字輸出到控制臺之后,發現從第11位數字之后,輸出的數字就都是0
確實,平分取中法優點是計算簡單,但它有許多缺點:首先很難說明取什么樣的種子值可保證有足夠長的周期;其次容易退化為一常數,甚至退化為零,因為一旦有一個數為零,以后的數都將為零。
平方取中法的成功與否與種子及常數的選取關系很大,一般說來,s值很大時,種子取值也很大,可使退化推遲,周期加長
我們把s設為4,x設為66666666再統計試試看
統計結果2
這下數字分布就比較平均了,這個算法還是有可取之處的
線性同余法
線性同余法亦稱“線性同余隨機數生成器”,由美國萊默爾在1951年提出,它是很常見的一種隨機數生成算法。它的遞推公式如下:
其中A,B,M是設定的常數,用線性同余法產生隨機數的特點是非常容易實現,生成速度快。線性同余法的最大周期是M,要使周期達到最大,要滿足以下條件:
下面我們看看線性同余法的效果
輸出
0.688931106889311 0.8266173382661733 0.18218178182181782 0.6719328067193281 0.1777822217778222 0.24517548245175483 0.7823217678232177 0.8855114488551145 0.8949105089491051 0.8066193380661933再輸出一萬個數統計試試
統計結果
效果也很不錯
其他的隨機數生成方法還有很多,例如XorShift算法通過異或和位移實現 , 每次生成不同的32位, 周期為2的32次方減1,也很簡單高效
歡迎關注微信公眾號:Java后臺開發
致力于分享原創計算機與軟件開發知識及SSM、Spring cloud、Redis、微服務等Java后端開發技術
公眾號里還有很多開發工具及學習資料
總結
以上是生活随笔為你收集整理的计算机随机数是如何生成的?(平分取中法、线性同余法)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FPGA学习笔记_图像处理3_FPGA实
- 下一篇: Egg中使用DiyUpload实现图片批