• php抽奖概率


    测试数据:

    测试表结构:

    CREATE TABLE `pt_fenxiao_prize` (
      `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
      `prize` varchar(60) NOT NULL DEFAULT '' COMMENT '奖项名称',
      `rate` int(10) NOT NULL DEFAULT '0' COMMENT '中奖概率',
      `num` int(10) NOT NULL DEFAULT '0' COMMENT '中奖数量',
      `prize_num` int(10) NOT NULL DEFAULT '0' COMMENT '已抽中数量',
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

    抽奖demo

    <?php
    /**
     * Created by PhpStorm.
     * User: HOUDJ
     * Date: 2021/1/29
     * Time: 13:44
     */
    
    namespace appapicontroller;
    
    
    use thinkDb;
    
    class Prize extends Base
    {
        /**
         * Notes:抽奖
         * User: HOUDJ
         * Date: 2021/1/29
         * Time: 14:52
         */
        public function prize(){
            $list=Db::name('fenxiao_prize')->select();
            $key=$this->prizeHandle($list);
            if($key){
                Db::name('fenxiao_prize')->where('id',$key)->setInc('prize_num');
                $prizename=Db::name('fenxiao_prize')->where('id',$key)->value('prize');
                echo '恭喜您,喜中'.$prizename;
            }else{
                echo '哎呀 没中奖';
            }
        }
    
        /**
         * Notes:抽奖操作
         * User: HOUDJ
         * Date: 2021/1/29
         * Time: 14:49
         * @param $prizes
         * @return int|string
         */
        public function prizeHandle($prizes){
            //进行抽奖
            $data = [];
            foreach ($prizes as $prize) {
                if (($prize['num'] - $prize['prize_num']) > 0) {
                    $data[$prize['id']] = $prize['rate'];
                }
            };
    
            //获取所有奖品的总概率
            $sum = array_sum($data);
            $countSum = 100;
            if ($sum < $countSum) {
                $data[0] = $countSum - $sum;//不满100%,表示没有抽取到奖品
            }
            $result = 0;
            //概率数组总精度
            //概率数组循环
            foreach ($data as $key => $value) {
                $randNum = mt_rand(1, $countSum);
                if ($randNum <= $value) {
                    $result = $key;
                    break;
                } else {
                    $countSum -= $value;
                }
            }
            unset($data);
            return $result;//抽到的ID值,0表示没有抽到奖品
        }
    }
  • 相关阅读:
    UOJ#48最大矩形面积
    webbench压力测试工具
    编写NPAPI plugin的命名问题
    搜狗浏览器查看合法插件的方法
    结构型模式之 享元模式
    结构型模式之 外观模式
    结构型模式之 装饰模式
    结构型模式之 桥接模式
    结构型模式之 适配器模式
    Codeforces Round #102 (Div. 2) 题解
  • 原文地址:https://www.cnblogs.com/houdj/p/14344965.html
Copyright © 2020-2023  润新知