什么是制作和赔率系统最有效的方法?

时间:2011-11-07 19:15:35

标签: php math random probability

我正在尝试设计一个从1-100开始的赔率系统,但它也使用0-1来获得更少的赔率。

有人告诉我应该使用浮点格式,但我不知道。

基本上我有..

if (mt_rand(1,1000)/100 == $odds) {} else if (mt_rand(1,100) == $odds) {}
然而,这只会产生相同的概率。

我在PHP手册中查找浮点格式,但那里的答案无法帮助我。

3 个答案:

答案 0 :(得分: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
}

答案 1 :(得分: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乘法就会将它从第一个(虚假浮动)比较中删除。

答案 2 :(得分: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!";
   }
}