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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

计算机随机数是如何生成的?(平分取中法、线性同余法)

發布時間:2024/8/1 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 计算机随机数是如何生成的?(平分取中法、线性同余法) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

計算機隨機數是如何生成的?(平分取中法、線性同余法)

  • 平方取中法
    • 輸出
    • 統計結果1
    • 統計結果2
  • 線性同余法
    • 輸出
    • 統計結果
  • 歡迎關注微信公眾號:Java后臺開發

隨機數無疑是計算機程序設計中極其重要的一個東西,無論是完成簡單的抽獎小程序還是使用蒙特卡洛方法都需要使用隨機數,而很多人每天都在使用隨機數,卻不知道隨機數是怎么生成的。

平方取中法

平方取中法是我們的計算機之父馮·諾依曼提出的。此法開始取一個2s位的整數,稱為種子,將其平方,得4s位整數(不足4s位時高位補0),然后取此4s位的中間2s位作為下一個種子數,并對此數規范化(即化成小于1的2s位的實數值),即為第一個(0,1)上的隨機數。以此類推,即可得到一系列隨機數。
它的算法公式如下

其中u代表生成的隨機數,x代表種子數
我們來看看計算機之父提出的隨機數算法效果如何,令s = 2,x = 6666,來輸出10個數看看

public class Random{ static long s = 2;static long x = 6666;public static double random() {long t = (x*x)/((long)Math.pow(10,s))%((long)Math.pow(10,2*s));x = t;return t*1.0/((long)Math.pow(10,2*s));}public static void main(String[] args) {for(int i = 0;i<10;i++)System.out.println(random());} }

輸出

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,要使周期達到最大,要滿足以下條件:

下面我們看看線性同余法的效果

public class Random{ static int A = 97;static int B = 3;static int M = 10001;static int N = 71;public static double random() {return (N = (N*A+B)%M)*1.0/M;}public static void main(String[] args) {for(int i = 0;i<10;i++)System.out.println(random());} }

輸出

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后端開發技術
公眾號里還有很多開發工具及學習資料

總結

以上是生活随笔為你收集整理的计算机随机数是如何生成的?(平分取中法、线性同余法)的全部內容,希望文章能夠幫你解決所遇到的問題。

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