朋友所写 概率问题

 /**
     * $arr     抽奖名单    array()
     * $n       中奖份数
     * $e       额外份数
     * $s       总份数
     * $s_      未中奖份数
     * $p       特殊概率
     * $pn      特殊用户抽取份数
     * $sid     特殊用户
     */
    public function checku($n,$arr,$p,$sid){
        $s_ = $s  = count($arr);          //未中奖总份数      总份数
        $pn = array_count_values($arr)[$sid];  //特殊用户抽取份数
        $e = ceil(($p * $s - $pn)/(1 - $p));    //特殊概率下需加的额外份数
        $check = array();           //中奖名单
        for($a=0 ;$a<$n ;$a++){
            if($pn){        //判断特殊用户剩余抽奖份数
                $s_ = $s_ + $e;     //未中奖总份数
            }
            $checknum = rand(1 , $s_);
            if($checknum > count($arr)){   //大于当前未中奖份数为特殊用户中奖
                $check[] = $sid;
                $pn--;
                $e--;
            }else{                      //否则普通用户中奖
                if(!$pn && $arr[$checknum]==$sid){
                    array_splice($arr,$checknum,1);
                }
                if($arr[$checknum]==$sid){
                    $pn--;
                }
                $check[] = $arr[$checknum];
                array_splice($arr,$checknum,1);
            }
            $s_ = count($arr);
        }
//        $arr=array();
//        for($a=1 ;$a<=100 ;$a++){
//            if($a%10) $arr[]=$a; else $arr[]=3;
//        }
//        $result=$this->checku(10,$arr,80/100,3);
//        echo "<pre/>";var_dump($result,array_count_values($result)[3]/count($result));die;
        return $check;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值