【问题标题】:What is the most efficient way to make and odds system?制作和赔率系统的最有效方法是什么?
【发布时间】:2011-12-23 21:22:03
【问题描述】:

我正在尝试设计一个从 1 到 100 的赔率系统,但它也使用 0-1 来表示更稀有的赔率。

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

基本上我有..

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

然而,这只会产生相同的概率。

我在 PHP 手册中查找了浮点格式,但那里的答案对我没有帮助。

【问题讨论】:

  • 如果您要投票赞成关闭,至少请给出评论/原因...这是一个编程逻辑问题,我不明白为什么应该关闭它。
  • 我问这个问题是不是做错了什么? =/
  • 概率是一个比率,一个比率可以表示为小数,浮点数是小数。只做计算 :-) en.wikipedia.org/wiki/Odds
  • 对,我在一定程度上理解了数学逻辑,但是我不知道获取浮点的正确语法(基本上是 rand(0,1) 值)
  • @PRPG - 我认为你的问题很好

标签: php math random probability


【解决方案1】:

请参阅Odds,了解如何将赔率转换为概率。如果您有4:1 的几率,那么该事件的概率为1/5 == 0.2。如果您的赔率为.2:1,那么事件发生的概率为5/6(约0.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
}

【讨论】:

    【解决方案2】:

    浮点值不精确。 (见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 乘法将已经将其从第一个(假浮点数)比较中剔除。

    【讨论】:

      【解决方案3】:
      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!";
         }
      }
      

      【讨论】:

        猜你喜欢
        • 2011-03-02
        • 1970-01-01
        • 2021-11-15
        • 1970-01-01
        • 1970-01-01
        • 2019-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多