我正在尝试设计一个从1-100开始的赔率系统,但它也使用0-1来获得更少的赔率。
有人告诉我应该使用浮点格式,但我不知道。
基本上我有..
if (mt_rand(1,1000)/100 == $odds) {} else if (mt_rand(1,100) == $odds) {}
然而,这只会产生相同的概率。
我在PHP手册中查找浮点格式,但那里的答案无法帮助我。
答案 0 :(得分:3)
请参阅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
}
答案 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
,并将其与1
到100
范围内的随机整数进行比较。如果赔率已经是一个整数而不是一个浮点数,那么*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!";
}
}