抽奖算法

生成一个列表,分成几个区间,例如列表长度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; 
}



你可能感兴趣的:(算法,PHP)