2011-11-07 78 views
2

我試圖設計一個從1到100的賠率系統,但是它也使用0-1來獲得更少的賠率。什麼是最有效的製造方式和賠率制度?

我被告知應該使用浮點格式,但我不知道。

基本上我有..

if (mt_rand(1,1000)/100 == $odds) {} else if (mt_rand(1,100) == $odds) {} 

然而,只有產生了相同的概率。

我在PHP手冊中查了浮點格式,但那裏的答案不能幫助我。

+2

如果你打算把票投給了密切的,至少給一個評論/原因......這是一個編程邏輯問題,我不明白爲什麼它應該關閉。 – Webnet

+0

在問這個問題時我做錯了什麼嗎? =/ –

+0

概率是比率,比率可以表示爲小數,浮點是小數。只是做計算:-) http://en.wikipedia.org/wiki/Odds – prodigitalson

回答

3

請參閱Odds瞭解如何將您的機率轉換爲概率。如果您的賠率爲4:1,那麼該事件的概率爲1/5 == 0.2。如果你的賠率是.2:1,那麼事件發生的概率是5/6(約爲.833)。一般來說,如果賠率是m:n,那麼概率是n/(m+n)

現在,如果您想模擬事件是否發生,您需要獲得01之間的隨機浮點數,然後檢查它是否小於事件的概率。您可以使用類似mt_rand(0,1000)/1000的東西來獲得01之間的隨機數。

例子:

$odds1 = 4; // 4:1 
$prob1 = 1/($odds1+1); // 1/5 

if(mt_rand(0,1000)/1000 <= $prob1) { 
// event happened 
} 

$odds2 = .2; // .2:1 
$prob2 = 1/($odds2+1); // 5/6 

if(mt_rand(0,1000)/1000 <= $prob2) { 
// event happened 
} 
+0

這個完美解釋,非常感謝! –

+0

正是我需要的,謝謝你,先生。 –

1

浮點值是不精確的。 (請參閱Why does `intval(19.9 * 100)` equal `1989`?search: php floating point inexact。)

對於浮點值,不能使用==。由於固有的精度損失,簡單的5/10 == 0.5可能已經是錯誤的。

您可以比較前一輪的數字,你有什麼我想你的情況建議,預轉換成浮動整數:

 #  52 ==  100*0.52 
if (mt_rand(1,100) == round(100*$odds)) { 

而是與另一浮動比較0.99的,您將您的賠率爲整數99,並將其與1100範圍內的隨機整數進行比較。如果賠率已經是一個整數,而不是浮點數,那麼*100乘法已經將其從第一個(浮點數)比較中刪除。

1
if($odds < 1){ 
    // floating point math here 
    if((float)mt_rand(0,100)/100.0 < $odds){ 
     echo "you're a float winner, harry"; 
    } 
}else{ 
    if(mt_rand(0,100) < $odds){ 
     echo "you're an int winner, harry!"; 
    } 
} 
相關問題