php实现抽奖

不啰嗦,直接上代码

<?php
class LuckDrawTest
{
    private $number_rand = [] ; // 中奖号码 不重复
    private $number_arr  = [] ; // 已经获得本次部分
    private $number_num       ; // 中奖总概率
    private $number_sum  = 0  ; // 单次概率 即获得中奖号码个数
    private $luck_num    = 0  ; // 中奖号码
    private $is_luck     = 0  ;
    private $luck_arr    = [] ;  // 中奖信息

    public function __construct()
    {
        $this->number_num = 100 ; // pro 比例 百分之1 则为 100  万分之1 则为 10000
    }

    // 全概率计算
    public function index()
    {
        // 全部有效奖品
        $prize_arr = [
            ['id'=>1, 'name'=>'10000元现金大礼包','pro'=>1],
            ['id'=>2, 'name'=>'5000元现金中礼包','pro'=>2],
            ['id'=>3, 'name'=>'2000元现金红包','pro'=>5],
            ['id'=>4, 'name'=>'1000元现金','pro'=>10],
            ['id'=>5, 'name'=>'500元购物券','pro'=>20],
            ['id'=>6, 'name'=>'200元奖品','pro'=>20],
        ] ;
        $this->luck_num = $this->get_rand() ; // 抽的号码
        $arr = [] ; // 获奖号码
        foreach ($prize_arr as $k=>$v){
            $this->number_sum = $v['pro'] ; // 对比开奖号码个数 即概率
            $this->number_arr = [] ;        // 重置单次中奖号码
            $this->get_rand(1) ;         // 获得开奖号码
            $arr[$k] = $this->number_arr ;  //
            if($this->is_luck){             // 如果已经中奖 则终止出号, 如果多人参与则 调整此处逻辑
                $this->luck_arr = $v ; break ; // 获得奖品id  取id 为了
            }
        }
        if(empty($this->luck_arr)){      // 判断是否已经中奖  如果有参与奖或者必得参与奖则在此处理
            $str =  '下次没准就能中哦' ;
        }else{
            $str = $this->luck_arr['name'] ; // 获得奖品标题
        }

        echo '我的号码:'. $this->luck_num . "\r\n我的奖品:" . $str."\r\n";
        print_r($arr) ; // 全部开奖号码
    }

    public function get_rand($t=0)
    {
        $read_number = mt_rand(1, $this->number_num) ;
        if(!$t) return $read_number ; // 幸运号码

        if(!in_array($read_number, $this->number_rand)){ // 随机数不存在已中奖号码中
            $this->number_arr[] = $read_number ;    // 本次奖品中奖号码
            $this->number_rand[] = $read_number ;   // 全部中奖号码
            $this->number_sum -- ;

            if(in_array($this->luck_num, $this->number_arr)){ // 判断是否已中奖
                $this->is_luck = 1 ;
                return true ;
            }
        }
        
        return $this->number_sum == 0 ? true : $this->get_rand(1) ; //
    }
}

外部直接调用

$t = new LuckDrawTest() ;
return $t->index() ;

其它项目逻辑自行处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值