Blogger Information
Blog 91
fans 0
comment 0
visits 203456
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
PHP 根据概率 实现抽奖转盘算法 代码
何澤小生的博客
Original
1459 people have browsed it

最近实现大转盘功能涉及到抽奖概率的算法问题,整理了一下相关代码,欢迎大家参考哈~~~

思路:

1. 录入中奖产品与中奖概率数据

// 奖项id,奖品,概率
$prize_arr = array(
    '0' => array('id'=>1,'prize'=>'平板电脑','v'=>2),
    '1' => array('id'=>2,'prize'=>'数码相机','v'=>5),
    '2' => array('id'=>3,'prize'=>'音箱设备','v'=>10),
    '3' => array('id'=>4,'prize'=>'4G优盘','v'=>15),
    '4' => array('id'=>5,'prize'=>'10Q币','v'=>30),
    '5' => array('id'=>6,'prize'=>'空奖','v'=>5),
);

2. 计算中奖概率

//计算中奖概率
function get_rand($proArr) {
    $result = '';
    //概率数组的总概率精度
    $proSum = array_sum($proArr);

    //概率数组循环
    foreach ($proArr as $key => $proCur) {
        //返回随机整数
        $randNum = mt_rand(1, $proSum);

        if ($randNum <= $proCur) {
            $result = $key;
            break;
        } else {
            $proSum -= $proCur;
        }
    }
    unset ($proArr);
    return $result;
}

3. 返回中奖信息

function get_prize($list = []){
    //拼装奖项数组
    $list_ids = array_column($list, 'id');
    $list_vs = array_column($list, 'v');
    // ID 为键,概率为值
    $arr = array_combine($list_ids, $list_vs);

    //根据概率获取奖项id
    $rid = get_rand($arr);
    //中奖项数组
    $res['yes'] = $list[$rid-1];

    //将中奖项从数组中剔除,剩下未中奖项
    unset($list[$rid-1]);
    // 重置索引
    $pr = array_values($list);
    //未中奖项数组
    $res['no'] = $pr;

    // 返回中奖数据
    $result = [
        'msg'   => '抽奖成功~',
        'code'  => 0,
        'data'  => $res['yes'],
    ];

    return $result;
}


函数调用方法:

$result = get_prize($prize_arr);
echo "<pre>";
print_r($result);


结果如下:

微信截图_20210121175157.png





转载请注明出处~~~~

Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post