2013-03-24 89 views
4

我有以下的数组:PHP阵列馏分

public $percentage = array(
    0 => 20.30, 
    1=> 19.96, 
    2=> 14.15, 
    3=> 45.59 
); 

//它总结在100%

我需要一个随机函数由值的百分比,

返回键

例如:得到0的可能性是20.30%,并且得到2的可能性14.15%, 第一个用户得到0,第二个有2

P租赁让我知道你建议我使用的功能是什么。

+1

函数究竟要做什么?我无法想象 – 2013-03-24 10:09:25

+1

你想要一个有20.3%概率返回0的函数,14.15%返回2等吗? – 2013-03-24 10:16:23

+0

你提供20.30%的概率为零 – 2013-03-24 10:23:46

回答

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; 
    } 
} 
+0

谢谢,它完成了这项工作! – 2013-03-24 10:32:36

+0

真棒,干得好! – saada 2013-03-24 11:21:35

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 # 
} 
+0

你的解决方案只会给0,3或什么都没有:http://codepad.viper-7.com/IlNobo – Antony 2013-03-24 10:25:23

+0

嗯......那样更好吗? :) – saada 2013-03-24 10:29:25

+0

不会。问题是,您生成了一个随机数,假设它是10,那么根据该数组,结果为0。如果随机数是25,则结果为3。如果随机数是50,则不会显示任何内容。 – Antony 2013-03-24 10:31:26

0

我会做这样的事情:

  1. 以1和10000之间的随机数(因为你有四个显著位)
  2. 如果数字是1年至2030年之间,然后它是一个零,如果是2031和(2031 + 1996)之间那么它是一个1等
  3. ...
  4. 利润
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);