2011-11-07 18 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(約0.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は、本質的な精度低下のためにすでに間違っている可能性があります。

あなたはどちらかの比較の前のラウンドの数字は、あなたの私はあなたの場合にお勧めするものを、前変換は整数に浮くことができます。代わりに別のフロートと0.99を比較する

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

、あなたがにあなたの確率を変換します整数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!"; 
    } 
}