PHP实现中奖概率算法

假设我们的奖品是如下:

$prize = array(   
    '0' => array('id'=>1,'prize'=>'ipad','v'=>1),   
    '1' => array('id'=>2,'prize'=>'iphone9','v'=>5),   
    '2' => array('id'=>3,'prize'=>'小米音箱','v'=>10),   
    '3' => array('id'=>4,'prize'=>'4GU盘','v'=>12),   
    '4' => array('id'=>5,'prize'=>'10Q币','v'=>22),   
    '5' => array('id'=>6,'prize'=>'下次没准就能中哦','v'=>50),   
);   

v表示中奖占比,比如说所有v加起来是100,而这里的ipad为1,表示中奖概率为1%。

算法思路
$data为一个预设的数组,假设数组为[100,200,300,400],最开始数据从1,1000这个范围内选一个数出来,如果不在这个范围内,则缩小范围,在这个例子中就是减去100,也就是第二个数在1,900这个范围内筛选,这样一直下去总会有一个满足要求。相当于在一个盒子里拿小球,第一个不是,第二个不是,第三个不是。。。全部取完,总会有一个是。

 function gen_rand($data) {
        $result = '';
        $sum = array_sum($data); //计算总权重
        foreach($data as $key => $val) {
            $randNum = mt_rand(1, $sum);
            if($randNum <= $val) {
                $result = $key;
                break;
            } else {
                $sum -= $val;
            }
        }
        unset($data);
        return $result;
    }

生成$data数组的方法

$keys = array_keys($prize);
$vals = array_column($prize, 'v');
$data = array_combine($keys,$vals);

你可能感兴趣的:(PHP实现中奖概率算法)