2013-08-18 53 views
2

在Ruby中,我需要從指數分佈中抽取平均值爲m。請告訴我如何快速有效地做到這一點。例如。讓我們:如何從Ruby中的指數分佈繪製?

m = 4.2 

def exponential_distribution 
    rand(m * 2) 
end 

當然不過,這個代碼是錯誤的,而且,它只返回整數結果。我今天已經很累了,請提醒我一個好的解決方案。

回答

4

如何使用the distribution gem?這裏有一個例子:

require 'distribution' 

mean = 4.2 
lambda = mean**-1 

# generate a rng with exponential distribution 
rng = Distribution::Exponential.rng(lambda) 

# sample a value 
sample = rng.call 

如果您需要更改的lambda值很多時候可能是直接使用p_value方法有用。一個好的樣本可以在the source code for Distribution::Exponential#rng中找到,它基本上只是在內部使用p_value。下面是如何做到這一點的例子:

require 'distribution' 

# use the same rng for each call 
rng = Random 

1.step(5, 0.1) do |mean| 
    lambda = mean**-1 

    # sample a value 
    sample = Distribution::Exponential.p_value(rng.rand, lambda) 
end 
+0

有多少這樣的寶石?如何比較使用例如。 Ruby前端到R?一旦我確定我有一個好的,我會用它。基本上這是我想要的。 –

+0

任何一種靈魂給我的代碼? –

+0

我相信它是由SciRuby的人制作和使用的,我對此有着豐富的經驗。我不知道任何有競爭力的寶石。 –

7

如果你想從頭開始,你可以使用inversion做到這一點。

def exponential(mean) 
    -mean * Math.log(rand) if mean > 0 
end 

如果你想用率lambda到其參數的平均值和速度是彼此的逆。除以-lambda而不乘以-mean

從技術上講,它應該是log(1.0 - rand),但由於1.0 - rand具有均勻的分佈,因此只需使用rand即可保存一個算術運算。

+0

謝謝。今天我真的很累。 –