PHP使用分数表示的概率数组

4
我可以帮助您翻译以下数组:
public $percentage = array(
   0 => 20.30,
   1=> 19.96,
   2=> 14.15,
   3=> 45.59
);

// it sums in 100%

// 这里的百分比总和为100%

我需要一个随机函数,根据值的百分比来返回键名,

例如:获取0的可能性为20.30%,获取2的可能性为14.15%, 第一个用户得到了0,第二个用户得到了2。

请告诉我您建议使用的函数是什么。


1
这个函数到底要做什么?我无法想象。 - user1646111
1
你需要一个函数,它有20.3%的概率返回0,14.15%的概率返回2等等吗? - Marko D
你是否准确地提取了0的20.30%概率? - user2193789
4个回答

7

将百分比转换为累积概率,然后与随机数进行比较。

如果随机数属于某个类别,则输出结果。如果不属于任何一个类别,则继续查找直到找到为止。这样可以根据数组中所述的百分比概率输出数字。

$percentage = array(
   0 => 20.30,
   1=> 19.96,
   2=> 14.15,
   3=> 45.59
);
$random = mt_rand(0,10000)/100;
foreach ($percentage as $key => $value) {
    $accumulate += $value;
    if ($random <= $accumulate) {
        echo $key;
        break;
    }
}

2
$random_n = mt_rand(0,10000)/100;
while(true){
  if($random_n <= $percentage[0])
    echo 0; break;
  else if($random_n <= $percentage[1])
    echo 1; break;
  else if($random_n <= $percentage[2])
    echo 2; break;
  else if($random_n <= $percentage[3])
    echo 3; break;
  else
    $random_n = mt_rand(0,10000)/100; //generate a new random #
}

不行。问题在于,你有一个随机生成的数字,比如说是10,然后根据数组,结果会给出0。如果随机数是25,则结果为3。如果随机数是50,则不会显示任何内容。 - Antony

1
<?php
$percentage = $tmp = array(
   0 => 20.30,
   1=> 19.96,
   2=> 14.15,
   3=> 45.59
);

sort($tmp);

$rand = mt_rand(0,100);
foreach($tmp as $percent) {
    if($percent >= $rand) {
        echo array_search($percent,$percentage);
        die();
    }
}

echo (count($percentage) - 1);

0
我会这样做:
  1. 取一个1到10000之间的随机数(因为你有四个有效数字)
  2. 如果这个数在1到2030之间,那么它就是0;如果在2031到(2031+1996)之间,那么它就是1,以此类推。
  3. ...
  4. 获利

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接