偏随机数是使随机数范围偏向于权重大的范围。
比如随机抽奖的概率规定如下:
一等奖概率10%,二等奖概率20%,三等奖概率30%,四等奖概率40%。
要达到此目的,编制抽奖程序如下:
/偏随机数实现概率抽奖
$lottery=["一等奖"=>10,"二等奖"=>20,"三等奖"=>20,"四等奖"=>40];
//生成权重数组
function rand_weighted($numbers){
$total=0;
$weight=[];
foreach($numbers as $number=>$w){
$total+=$w;
$weight[$number]=$total;
}
$rand=mt_rand(0,$total-1);
foreach($weight as $number=>$weight){
if($rand<$weight)
return $number;
}
}
//以下抽奖20次
$result=["一等奖"=>0,"二等奖"=>0,"三等奖"=>0,"四等奖"=>0];
for($i=0;$i<20;$i++){
$number = rand_weighted($lottery);
echo $number."\n";
if(!empty($result[$number]))
$result[$number]++;
else
$result[$number]=1;
}
echo "\nsummary:\n";
foreach($result as $number=>$count){
echo $number.":".$count."\n";
}
------输出:
四等奖
四等奖
二等奖
四等奖
四等奖
四等奖
二等奖
四等奖
三等奖
四等奖
四等奖
三等奖
一等奖
二等奖
二等奖
四等奖
四等奖
三等奖
三等奖
四等奖
summary:
一等奖:1
二等奖:4
三等奖:4
四等奖:11