如何生成指定分佈的隨機數

前言

對於隨機數平時咱們仍是比較經常使用的,通常都會直接經過各類語言原生自帶的隨機函數,好比 c++ 中有random()函數,java 中有 Random 類,python 有 random 模塊等等。都能很方便生成隨機變量,但它們有一個特色,那就是都服從均勻分佈,而有些場景須要要生成不一樣分佈的隨機變量。java

隨機變量

隨機變量即隨機函數,經過該函數能生成每一個可能事件對應的一個值。好比咱們擲骰子,每次按必定的機率生成一個值。有兩種類型變量,python

  • 離散型隨機變量,能取到的不相同的值是有限個或可列無限多個。
  • 連續型隨機變量,能取到的值能夠是連續的,在某個區間內可取任意一實數。

機率密度函數

主要用來表示不一樣點對應的機率大小,即X軸上每一個單位長度對應的機率大小。機率等於面積,當某區間長度趨於0時則變爲一個點,此時機率大小爲f(x)。c++

常見分佈

  • 伯努利分佈,即0-1分佈,隨機變量爲0或爲1,機率爲p和1-p。
  • 二項分佈,進行n次伯努利實驗,相對於不一樣成功次數對應的機率。
  • 泊松分佈,是二項分佈的極限形式。
  • 均勻分佈,在相同長度間隔的分佈機率是等可能的。
  • 正態分佈,又名高斯分佈,正態曲線呈鍾型,兩頭低,中間高。
  • 指數分佈,描述事件以恆定平均速率連續且獨立地發生的過程的機率分佈。
  • 邏輯斯蒂分佈,增加分佈,形狀有點像正態分佈。

生成分佈算法

  • Inverse Transform Method,首先生成一個均勻分佈的隨機數,再求指定分佈的分佈函數F(x),而後求得F(x)的逆函數G(x),將隨機數帶入逆函數獲得的即爲指定分佈的隨機數。
  • Acceptance-Rejection Method,首先生成一個均勻分佈隨機數a,設機率密度函數爲f(x),而後再生成一個均勻分佈隨機數b,若b<=f(a),則成功獲得指定分佈的隨機數,不然從頭開始。

實現

兩種算法都比較容易理解,第一個須要求逆函數,有時並很差求,而第二個基本沒什麼限制,對於任何分佈都能很完成任務。下面就用第二種方法實現生成幾種分佈的隨機數。git

正態分佈github

def normal_pdf(x, mu=0, sigma=1):
    return (1 / (math.sqrt(2 * math.pi) * sigma)) * (math.exp(-math.pow(x - mu, 2) / (2 * math.pow(sigma, 2))))
    
def standard_normal_rand():
    while True:
        a = random.uniform(-4.0, 4.0)
        b = random.uniform(0.0, 3.0)
        if b < normal_pdf(a):
            return a, b
複製代碼

這裏寫圖片描述

指數分佈算法

def exponential_pdf(x, lam=1):
    return lam * math.exp(-lam * x)
    
def exponential_rand():
    while True:
        a = random.uniform(0.0, 100.0)
        b = random.uniform(0.0, 3.0)
        if b <= exponential_pdf(a):
            return a, b
複製代碼

這裏寫圖片描述

泊松分佈bash

def poisson_pdf(x, lam=1):
    return (math.pow(lam, x) / math.factorial(x)) * math.exp(-lam)

def poisson_rand():
    while True:
        a = random.randint(0, 50)
        b = random.uniform(0.0, 1.0)
        if b <= poisson_pdf(a):
            return a, b
複製代碼

這裏寫圖片描述

github

https://github.com/sea-boat/MachineLearning_Lab/blob/master/distribution_gen.py併發

-------------推薦閱讀------------dom

個人2017文章彙總——機器學習篇機器學習

個人2017文章彙總——Java及中間件

個人2017文章彙總——深度學習篇

個人2017文章彙總——JDK源碼篇

個人2017文章彙總——天然語言處理篇

個人2017文章彙總——Java併發篇


跟我交流,向我提問:

這裏寫圖片描述

公衆號的菜單已分爲「分佈式」、「機器學習」、「深度學習」、「NLP」、「Java深度」、「Java併發核心」、「JDK源碼」、「Tomcat內核」等,可能有一款適合你的胃口。

爲何寫《Tomcat內核設計剖析》

歡迎關注:

這裏寫圖片描述
相關文章
相關標籤/搜索