對於隨機數平時咱們仍是比較經常使用的,通常都會直接經過各類語言原生自帶的隨機函數,好比 c++ 中有random()
函數,java 中有 Random 類,python 有 random 模塊等等。都能很方便生成隨機變量,但它們有一個特色,那就是都服從均勻分佈,而有些場景須要要生成不一樣分佈的隨機變量。java
隨機變量即隨機函數,經過該函數能生成每一個可能事件對應的一個值。好比咱們擲骰子,每次按必定的機率生成一個值。有兩種類型變量,python
主要用來表示不一樣點對應的機率大小,即X軸上每一個單位長度對應的機率大小。機率等於面積,當某區間長度趨於0時則變爲一個點,此時機率大小爲f(x)。c++
兩種算法都比較容易理解,第一個須要求逆函數,有時並很差求,而第二個基本沒什麼限制,對於任何分佈都能很完成任務。下面就用第二種方法實現生成幾種分佈的隨機數。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
複製代碼
https://github.com/sea-boat/MachineLearning_Lab/blob/master/distribution_gen.py併發
-------------推薦閱讀------------dom
跟我交流,向我提問:
公衆號的菜單已分爲「分佈式」、「機器學習」、「深度學習」、「NLP」、「Java深度」、「Java併發核心」、「JDK源碼」、「Tomcat內核」等,可能有一款適合你的胃口。
歡迎關注: