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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

随机数是如何生成的

發布時間:2024/8/23 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 随机数是如何生成的 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

引出

在現實中, 會有拋硬幣猜正反的操作, 硬幣要么是正, 要么是反, 在揭曉之前, 我們誰也不知道它現在的狀態. 而這, 是因為其中存在著很大的不確定因素, 如拋硬幣的力度、拋硬幣的角度、接硬幣的力度和角度、硬幣的重量、當前風速等等.

但是在計算機中, 要想生成一個隨機數, 就需要通過一個算法來實現, 那么生成隨機數的算法是如何實現的呢? 簡單想一下這個事情, 通過確定的輸入, 確定的步驟, 輸出不確定的值? 這還是計算機干的事情嗎?

當然不是, 所以一直都在說函數生成的是偽隨機數而不是真正的隨機數. 偽隨機數是什么呢? 我理解的就是, 雖然生成的數不是隨機的, 但是在進行概率統計時是均勻分布的, 雖然數字不是真正隨機的, 但是可以滿足日常使用就夠了.

在計算機中生成隨機數, 肯定要告訴它具體的操作步驟, 而步驟一旦確定, 生成的結果序列就確定了, 這也是為什么在調用隨機數生成函數的時候需要設定隨機種子了, 因為函數是固定的, 如果輸入也固定, 那結果就不會發生變化了. 這個隨機種子在實際中一般都使用當前時間戳.

所以, 現在問題就可以這樣描述了: 設定函數 f(x), 結果為[a, b, c, d…]. 其結果序列在隨機區間均勻分布.

那么如何生成這個函數呢? 簡單看了幾種隨機函數, 主要了解一下思想, 畢竟咱也不會真正的去寫一個這樣的函數.

計算機中的偽隨機數

平方取中

由偉大的馮諾依曼前輩想出的. 其隨機序列生成如下:

  • 接收四位數輸入 x
  • s=x^2
  • 若 s 不足8位, 左側補0
  • 取 s 的中間4位作為隨機數y
  • 將y 作為輸入, 回到步驟1, 生成下一個隨機數
  • 是不是感覺很簡單, 這樣都能生成隨機數? 為啥我沒想到. 而且, 這樣生成的數字符合統計學的均勻分布嗎? 別說, 我還真寫了一個小腳本, 跑了一下, 生成了一億條數據, 只把生成的四位數字判斷了一下. 結果其均勻分布效果不怎么樣.

    線性同余

    其函數描述很簡單: f(x)=(ax + b) % m. 隨機序列的生成同理, 將上一次的輸出作為下一次的輸入. 很明顯, 其中的 m 決定了序列生成隨機數的最大值, 截斷性線性同余法, 逆同余法 等是它的變種. 線性同余我嘗試了一下, 均勻分布還挺好的. 不過要看選擇的 a b m 是多少, 比如 Java 中用到的: a=25214903917, b=11, m=2^48.

    其他

    還有線性反饋移位寄存器法滯后斐波納契法馬特塞特旋轉法、WELL算法 等等…


    等等吧, 有很多生成隨機數的方法, 不過具體怎么生成并實現我并不關心, 我只是想了解一下它大概是如何工作的, 能夠如何生成隨機數. 畢竟隨機函數也用了這么久了, 稍微了解一下還是可以的. 上面這兩種都是不安全的隨機算法, 怎么說呢? 就是如果知道了當前的狀態, 就可以通過計算, 得出之后所產生的隨機數. 而一些安全的隨機算法, 即使攻擊者得到了大量的隨機輸出, 也很難預測未來的輸出. 看了幾種安全的隨機算法, 都沒看太明白, 水平有限…

    總結

    以上是生活随笔為你收集整理的随机数是如何生成的的全部內容,希望文章能夠幫你解決所遇到的問題。

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