【问题标题】:Generate random float numbers in range PHP在 PHP 范围内生成随机浮点数
【发布时间】:2013-12-20 05:28:50
【问题描述】:

我有一段代码通过以下代码初始化骰子对象:

public function initializeDiceSides($totalSides, $fair, $maxProbability = 100) {
   $maxTemp = $maxProbability;
   $sides = array();

   for ($side = 0; $side < $totalSides; $side++) {
     //if we want fair dice just generate same probabilities for each side
     if ($fair === true) {
       $probability = number_format($maxProbability/$totalSides, 5);
     } else {
       //set probability to random number between 1 and half of $maxTemp
       $probability = number_format(mt_rand(1, $maxTemp/2), 5);

       //subtract probability of current side from maxtemp
       $maxTemp= $maxTemp- $probability;

       $sides[$side] = $probability;
     }
   }

   echo $total . '<br />';
   print_r($sides);
}

上面的代码打印:

89
Array ( [0] => 48.00000 [1] => 13.00000 [2] => 14.00000 
        [3] => 9.00000 [4] => 2.00000 [5] => 2.00000 )

我希望能够生成浮点数而不是整数,我想要类似

Array ( [0] => 48.051212 [1] => 13.661212 [2] => 14.00031 
        [3] => 9.156212 [4] => 2.061512 [5] => 2.00000 )

【问题讨论】:

标签: php random


【解决方案1】:

我会生成从 0 到 999999 的随机数,然后将它们除以 100000

【讨论】:

    【解决方案2】:

    确保 $maxProbability 和 $totalSides 的值是浮点数。
    如果它们是整数,则结果将输入为整数。

    【讨论】:

      【解决方案3】:

      一个简单的方法是使用lcg_value 并乘以范围并加上最小值

      function random_float ($min,$max) {
          return ($min + lcg_value()*(abs($max - $min)));
      }
      

      【讨论】:

        【解决方案4】:

        您可以将输入到mt_random 的变量乘以一个因子,例如 100000,然后将输出除以相同的因子以获得一个浮点值。

        【讨论】:

          【解决方案5】:
          function random_float($min = 0, $max = 1, $includeMax = false) {
              return $min + \mt_rand(0, (\mt_getrandmax() - ($includeMax ? 0 : 1))) / \mt_getrandmax() * ($max - $min);
          }
          

          【讨论】:

          • 稍微解释一下代码的作用将对帮助 OP 和所有希望学习 OP 的社区用户大有帮助
          • @ochi 想了想,但这似乎是多余的。这使用在一个范围内生成随机数的函数的事实上的标准方法签名。而且问题的作者已经知道mt_rand,它使用了相同的两个参数。最后,最后一个(第三个)参数是不言自明的。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2015-10-10
          • 2014-03-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-24
          • 2012-08-06
          相关资源
          最近更新 更多