抽奖咯

95 阅读1分钟

这个是最经典的抽奖算法,很好用的哦

<?php

    // 准备奖品池
    // weight代表奖品权重  权重越大被抽到的可能性也就越大
    // 可以在后台进行设置
    // 如果不希望该奖品被抽到  权重可以给设置成0
    $rewardOptions = array(
        array('id' => 1, 'name' => '橙武', 'weight' => 1), 
        array('id' => 2, 'name' => '紫武', 'weight' => 5), 
        array('id' => 3, 'name' => '蓝武', 'weight' => 1), 
        array('id' => 4, 'name' => '绿武', 'weight' => 1), 
        array('id' => 5, 'name' => '白武', 'weight' => 1), 
    );

    // 获取抽到的奖品ID
    $rewardId = getRewardId($rewardOptions);
    // 得到奖品ID  进行相关业务操作
    // .....
    // 展示对应的奖品
    echo $rewardOptions[$rewardId - 1]['name'];


 //方法 getRewardId(奖品池, 随机数开始值(中奖权重的最小值))
    function getRewardId($arr, $start = 1) {
        // 计算总权重
        //array_column($arr, 'weight')获取数组中的weight组成新的数组
        //array_sum计算数组和
        $totalWeight = array_sum(array_column($arr, 'weight'));
        foreach($arr as $k => $v) {
            // 判断权重和随机数的对比得出,是否抽中,随机数的开始值建议也变成一个随机数相对公平
            $random = mt_rand($start, $totalWeight);
            if($random <= $v['weight']) {
                return $v['id'];
            } else {
                $totalWeight -= $v['weight'];
            }
        }
    }

抽奖的功能分析

活动管理(不同活动的管理)
活动奖品管理(奖品图片,权重,名称等的管理)
中奖记录管理(核实发放中奖,中奖记录)
用户管理
用户登录
用户抽奖