php 中奖概率算法

上次项目中有个抽奖活动,中奖概率算法整理成一篇笔记

/**
     * 中奖概率算法
     * v表示中奖概率,注意其中的v必须为整数,可以将对应的奖项的v设置成0,即意味着该奖项抽中的几率是0,数组中v的总和(基数),基数越大越能体现概率的准确性。本例中v的总和为100,那么 特等奖 对应的中奖概率就是1%,如果v的总和是10000,那中奖概率就是万分之一。
     *
     * $arr = array(
                    array('id'=>1,'name'=>'特等奖','v'=>1),
                    array('id'=>2,'name'=>'一等奖','v'=>5),
                    array('id'=>3,'name'=>'二等奖','v'=>10),
                    array('id'=>4,'name'=>'三等奖','v'=>12),
                    array('id'=>5,'name'=>'四等奖','v'=>22),
                    array('id'=>6,'name'=>'没中奖','v'=>50)
            );
     *
     */
    if (!function_exists("lottery_arithmetic")){
        function lottery_arithmetic($status) {

            $proArr = [];
            switch ($status){
                case 1: //普通中奖
                    $proArr = array(
                        array('id'=>1,'name'=>'一等奖','v'=>1), //百分之十
                        array('id'=>2,'name'=>'二等奖','v'=>3),
                        array('id'=>3,'name'=>'二等奖','v'=>3),
                        array('id'=>4,'name'=>'二等奖','v'=>4),
                        array('id'=>5,'name'=>'二等奖','v'=>4),
                        array('id'=>6,'name'=>'三等奖','v'=>30),
                        array('id'=>7,'name'=>'三等奖','v'=>20),
                        array('id'=>8,'name'=>'三等奖','v'=>20),
                        array('id'=>9,'name'=>'三等奖','v'=>20),
                    );
                    break;
                case 2: //一定中奖
                    $proArr = array(
                        array('id'=>1,'name'=>'一等奖','v'=>1), //百分之十
                        array('id'=>2,'name'=>'二等奖','v'=>3),
                        array('id'=>3,'name'=>'二等奖','v'=>3),
                        array('id'=>4,'name'=>'二等奖','v'=>4),
                        array('id'=>5,'name'=>'二等奖','v'=>4),
                        array('id'=>6,'name'=>'三等奖','v'=>30),
                        array('id'=>7,'name'=>'三等奖','v'=>20),
                        array('id'=>8,'name'=>'三等奖','v'=>20),
                        array('id'=>9,'name'=>'三等奖','v'=>20),
                    );
                    break;
                default:
            }


            $result = array();
            $arr = [];
            foreach ($proArr as $key => $val) {
                $arr[$key] = $val['v'];
            }

            // 概率数组的总概率「为100」
            $proSum = array_sum($arr);

            asort($arr);// 根据键值对数组进行升序排序

            // 概率数组循环
            foreach ($arr as $k => $v) {
                $randNum = mt_rand(1, $proSum); // 在 1和 总权重 之间返回随机整数

                if ($randNum <= $v) {
                    $result = $proArr[$k];
                    break;
                } else {
                    $proSum -= $v;
                }
            }

            return $result;
        }
    }

使用示例

dd(lottery_arithmetic(1));

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值