<?php
//简单的抽奖算法
//prob概率 总和为1k , 10k , 100k,自己设  id为具体奖品
$data = [
    ['prob' => 6000 , 'id' => 1],
    ['prob' => 16500 , 'id' => 2],
    ['prob' => 16500 , 'id' => 3],
    ['prob' => 900 , 'id' => 4],
    ['prob' => 700 , 'id' => 5],
    ['prob' => 59000 , 'id' => 6],
    ['prob' => 200 , 'id' => 7],
    ['prob' => 200 , 'id' => 8],
];

//抽奖概率

if(count($data) == 1){
    $gift = $data[0];
}else{
    //抽奖概率
    $prob_arr = [];
    $proSum = array_sum(array_column($data,'prob')); //概率总数目 千级 万级

    //计算1  推荐  10w内存消耗5M
    foreach ($data as $dk => $dg) {
        for($i=0;$i<$dg['prob'];$i++){
            $prob_arr[] = $dk;
        }
    }
    //计算2  这种的内存消耗是1的2倍 时间消耗是1的4倍(10w测试,内存消耗10M) 并且概率总数越大,差别越大 这个不要用
//    foreach ($data as $dk => $dg) {
//        $prob_arr = array_merge($prob_arr,array_fill(0,$dg['prob'],$dk));
//    }

    shuffle($prob_arr);//打乱数组
    $prob_id = $prob_arr[mt_rand(0,$proSum-1)];

    //抽奖概率结束
    $gift = $data[$prob_id];
}

//本机联想E470测试结果如下

//0.000700 ~ 0.000200 ,内存使用189k 总和1k
//0.001400 ~ 0.004400 ,内存使用706k 总和10k
//0.040100 ~ 0.024300 ,内存使用5M   总和100k

Comments are closed.

Post Navigation