我試圖設計一個從1到100的賠率系統,但是它也使用0-1來獲得更少的賠率。什麼是最有效的製造方式和賠率制度?
我被告知應該使用浮點格式,但我不知道。
基本上我有..
if (mt_rand(1,1000)/100 == $odds) {} else if (mt_rand(1,100) == $odds) {}
然而,只有產生了相同的概率。
我在PHP手冊中查了浮點格式,但那裏的答案不能幫助我。
我試圖設計一個從1到100的賠率系統,但是它也使用0-1來獲得更少的賠率。什麼是最有效的製造方式和賠率制度?
我被告知應該使用浮點格式,但我不知道。
基本上我有..
if (mt_rand(1,1000)/100 == $odds) {} else if (mt_rand(1,100) == $odds) {}
然而,只有產生了相同的概率。
我在PHP手冊中查了浮點格式,但那裏的答案不能幫助我。
請參閱Odds瞭解如何將您的機率轉換爲概率。如果您的賠率爲4:1
,那麼該事件的概率爲1/5 == 0.2
。如果你的賠率是.2:1
,那麼事件發生的概率是5/6
(約爲.833)。一般來說,如果賠率是m:n
,那麼概率是n/(m+n)
。
現在,如果您想模擬事件是否發生,您需要獲得0
和1
之間的隨機浮點數,然後檢查它是否小於事件的概率。您可以使用類似mt_rand(0,1000)/1000
的東西來獲得0
和1
之間的隨機數。
例子:
$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
}
這個完美解釋,非常感謝! –
正是我需要的,謝謝你,先生。 –
浮點值是不精確的。 (請參閱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
,並將其與1
至100
範圍內的隨機整數進行比較。如果賠率已經是一個整數,而不是浮點數,那麼*100
乘法已經將其從第一個(浮點數)比較中刪除。
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!";
}
}
如果你打算把票投給了密切的,至少給一個評論/原因......這是一個編程邏輯問題,我不明白爲什麼它應該關閉。 – Webnet
在問這個問題時我做錯了什麼嗎? =/ –
概率是比率,比率可以表示爲小數,浮點是小數。只是做計算:-) http://en.wikipedia.org/wiki/Odds – prodigitalson