生成一个列表,分成几个区间,例如列表长度100,1-20是靴子的区间,21-45是披风的区间等,然后随机从100取出一个数,看落在哪个区间。算法时间复杂度:预处理O(MN),随机数生成O(1),空间复杂度O(MN),其中N代表物品种类,M则由最低概率决定。
php代码实现如下:
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; }