2014-01-12 64 views
0

假設我有一個簡單的程序,它可以模擬拋硬幣,並且具有由表達式指定的給定概率。它可能是這個樣子:現在計算表達式解析爲真的預期概率

# This is the probability that you will get heads. 
$expr = "rand < 0.5" 

def get_result(expr) 
    eval(expr) 
end 

def toss_coin 
    if get_result($expr) 
    return "Head" 
    else 
    return "Tail" 
    end 
end 

,我也想告訴用戶越來越Head的概率。

對於給定的表達

"rand < 0.5" 

我們可以眼球它說的概率爲50%,因爲蘭特返回0和1之間的數,因此,表達式求的真正50%平均時間。

但是,如果我決定提供一個操縱拋硬幣,其中用於確定結果的表達式是

"rand < 0.3" 

現在,我已經得到Head 30%的機會。

是否可以編寫一個方法,該方法將採用任意表達式(計算結果爲布爾值!)並返回其解析爲true的概率?

def get_expected_probability(expr) 
    # Returns the probability the `expr` returns true 
    # `rand < 0.5` would return 0.5 
    # `rand < 0.3` would return 0.3 
    # `true` would return 1 
    # `false` would return 0 
end 
+0

聽起來像家庭作業 –

+1

如果功課,也許爲哲學101. –

+0

假設(與'需要'時間')我們有't = Time.new.year == 2014;睡眠(RAND(5)); t'。無論何時執行,它返回true的概率都是零或一。今天,我們可以說真的概率是1.0。但是當我們準備在2015年響起時呢? 'get_expected_probability'可能不知道這是在舊年還是新年執行的。爲了返回0.0到1.0之間的概率,我們需要擴展模型來表示2014年代碼執行的概率,這個概念可能沒有任何意義。所以,我認爲答案是「否」。 –

回答

1

猜測會,這將是theoreticially可能寫出這樣的方法,假設你限制自己rand和確定性的數學函數和有系統的浮點執行完整的知識等

然而,通過大量執行該表達式並跟蹤其成功的百分比,該概率將更加直接地與近似相關。

1

爲了簡單比較一個統一的隨機數,是的,但總的來說,沒有。它取決於你用來確定布爾值的表達式的分佈,你可以用怪異的分佈來編寫任意複雜的表達式。然而,憑經驗估計概率是非常簡單的。

根據表達式創建一個伯努利(0/1)結果,當表達式爲真時產生1,當它爲假時產生0。生成大量(n個)。伯努利結果的長期平均值將趨於真實的可能性。如果你打電話給那個頂帽子,並且真實值是P,那麼頂帽子應該在95%的時間內落在p +/- (1.96 * sqrt(p*(1-p)/n))的範圍內。您可以從中看出,樣本量n越大,您的估計值越精確。

1

一個令人難以置信的近似方法是評估表達很多次,並估計它收斂的概率。 Law of Large Numbers保證當n接近無窮大時,就是那個概率。

$expr = "rand < 0.5" 

def get_result(expr) 
    eval(expr) 
end 

n = 1000000 
a = Array.new(n) 

n.times do |i| 
    a[i] = eval($expr) 
end 

puts a.count(true)/n.to_f 

返回0.499899我。