簡體   English   中英

隨機數生成器說明

[英]Random Number Generator Explanation

from random import *
def main():
    t = 0
    for i in range(1000):  # thousand
        t += random()
    print(t/1000)
main()

我正在看教授給我的示例程序的源代碼,就遇到了這種RNG。 誰能解釋這個RNG的工作原理?

如果繪制這些點,您會看到這實際上會產生一個關於隨機函數均值的高斯分布(“正態”)。

在此處輸入圖片說明

按照C / C ++中的正態分布生成隨機數,談到隨機數的生成; 如果您所擁有的只是一個統一的數字生成器(如標准C中的代碼),這是一種非常常見的技術。

我在這里給您的是從函數中提取的100,000個值的直方圖(當然,如果您不熟悉python,則返回不打印)。 y軸是值出現的頻率,x軸是值的區間。 如您所見,平均值為1/2,通過3個標准差(占數據的99.7%),我們在該范圍內幾乎沒有值。 那應該很直觀; 我們“通常”獲得1/2,很少獲得.99999

看一下文檔。 它寫得很好: https : //docs.python.org/2/library/random.html

這個想法是,該程序會生成一個隨機數1000次,足以獲得0.5的均值

該程序使用中央極限定理 -具有有限方差的獨立且均勻分布的隨機變量X和漸近收斂到正態(aka高斯)分布,其均值是均值的總和,方差是方差的總和。 將其乘以N( X的總和),得到樣本均值(即平均值)。 如果預期值X是μ和方差Xσ2,樣本的預期值的意思是還μ並且它具有方差σ2 / N。

由於Uniform(0,1)的均值為0.5,方差為1/12,因此您的算法所生成的結果將非常接近於正態分布,均值為0.5,方差為1/12000。 因此,有99.7%的結果應落在平均值的+/- 3標准偏差內,即在0.5 +/- 0.0274范圍內。

這是生成法線的一種極其低效的方法。 更好的替代方法包括Box-Muller方法, Polar方法或Ziggurat方法。

使這個隨機的原因是調用random()函數。 random()會在0和1之間生成1(出於大多數實際目的)隨機浮點​​數。

>>>random()
0.1759916412898097
>>>random()
0.5489228122596088

等等

其余的只是將每個隨機數加到總數上,然后除以隨機數,從本質上找到所有1000個隨機數的平均值,正如Cyber​​指出的那樣,這實際上根本不是一個隨機數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM