带分数的概率PHP数组

带分数的概率PHP数组,php,math,random,Php,Math,Random,我有以下数组: public $percentage = array( 0 => 20.30, 1=> 19.96, 2=> 14.15, 3=> 45.59 ); //总数为100% 我需要一个随机函数以值的百分比返回键 例如:获得0的可能性为20.30%,获得2的可能性为14.15%, 第一个用户得到0,第二个用户得到2 请告诉我您建议我使用的功能。$random\u n=mt\u rand(010000)/100; $random_n =

我有以下数组:

public $percentage = array(
   0 => 20.30,
   1=> 19.96,
   2=> 14.15,
   3=> 45.59
);
//总数为100%

我需要一个随机函数以值的百分比返回键

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

请告诉我您建议我使用的功能。

$random\u n=mt\u rand(010000)/100;
$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 #
}
while(true){ 如果($random\n我会做如下事情:

  • 取一个介于1和10000之间的随机数(因为您有四个有效数字)
  • 如果数字在1到2030之间,那么它是零,如果它在2031到(2031+1996)之间,那么它是1等等
  • 利润

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

    如果随机数属于某个类别,则输出结果。如果不是,则移动到下一个类别,直到找到一个为止。这允许您根据数组中说明的百分比概率输出一个数字

    $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;
        }
    }
    
    $percentage=array(
    0 => 20.30,
    1=> 19.96,
    2=> 14.15,
    3=> 45.59
    );
    $random=mt_兰特(010000)/100;
    foreach($键的百分比=>$值){
    $acculate+=$value;
    
    如果($random函数必须做什么?我无法想象你想要一个概率为20.3%的函数返回0,概率为14.15%的函数返回2等等?你是否提取了概率为20.30%的零。问题是,你生成了一个随机数,假设它是10,然后根据数组,结果是0。如果随机数是25,结果为3。如果随机数为50,则不会显示任何内容。
    $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;
        }
    }