PHP实现加权随机数(Weighted Random sampling)的生成算法
假设有如下一个数组[*]$list = array("A" => 5, "B" => 10, "C" => 15, "D" => 20, "E" => 50);
表示随机ABCDE,取到A的概率是5%,B为10%,C为15%,D为20%,E为50%。
思路很简单,画一根数轴,长度是ABCDE的权值的总和,按照他们的权值,分割这个数轴。
然后随机取数轴上的一点,落在哪个区间,就取哪个值。
http://cnn237111.blog.运维网.com/attachment/201301/11/2359144_1357907401Fkqf.jpg
具体算法如下
[*]function GetRandom() {
[*] $list = array("A" => 5, "B" => 10, "C" => 15, "D" => 20, "E" => 50);
[*] $sum = 0;
[*] $listPoint = array(0);//这个数组记录了每个切割点的值,就是记录了数轴上,5,15,30,50,100的值。
[*] foreach ($list as $key => $value) {
[*] $sum+=$value;//计算出权值的总和
[*] array_push($listPoint, $sum);//把分割点放到数组中
[*] }
[*] $num = rand(0, $sum);//取0到sum之间一个随机值
[*] //echo $num . ":";
[*] for ($i = 0; $i < count($listPoint) - 1; $i++)
[*] {
[*] if ($num >= $listPoint[$i] && $num
页:
[1]