生成一个列表,分成几个区间,例如列表长度100,1-20是靴子的区间,21-45是披风的区间等,然后随机从100取出一个数,看落在哪个区间。算法时间复杂度:预处理O(MN),随机数生成O(1),空间复杂度O(MN),其中N代表物品种类,M则由最低概率决定。
php代码实现如下:
<?php
header("Content-type: text/html; charset=utf-8");
$prize_arr = array(
array('id'=>1,'prize'=>'一等奖','v'=>1),
array('id'=>2,'prize'=>'二等奖','v'=>5),
array('id'=>3,'prize'=>'三等奖','v'=>10),
array('id'=>4,'prize'=>'四等奖','v'=>12),
array('id'=>5,'prize'=>'五等奖','v'=>22),
array('id'=>6,'prize'=>'六等奖','v'=>50)
);
shuffle($prize_arr);
$arr = array();
foreach ($prize_arr as $key => $val)
{
$arr[] = $val['v'];
}
$zjx = get_rand($arr);
if($zjx < 0)
{
echo '未中奖';
}
else
{
echo $prize_arr[$zjx]['prize'];
}
function get_rand($proArr)
{
$result = -1;
$proSum = array_sum($proArr);
foreach ($proArr as $key => $proCur)
{
$randNum = mt_rand(1, $proSum);
if ($randNum <= $proCur)
{
$result = $key;
break;
}
else
{
$proSum -= $proCur;
}
}
return $result;
}
转载于:https://blog.51cto.com/hehe1987/1643735