Rumah  >  Soal Jawab  >  teks badan

php抽奖算法

万能的大神们有什么比较好的抽奖算法。

天蓬老师天蓬老师2724 hari yang lalu443

membalas semua(4)saya akan balas

  • 阿神

    阿神2017-04-11 10:42:37

    return false

    balas
    0
  • PHPz

    PHPz2017-04-11 10:42:37

    这是我之前写的。网上用流行的是两种算法,概率太高了。只好回归到课本里面的,直接把所有中奖的球和干扰球放到篮子里面,随机抽。
    而且抽奖直接抽,无需放回,我们只要再出奖后,奖品如果没了,就直接当成谢谢参与来出奖。

    <?php
    namespace Home\Controller;
    use Think\Controller;
    class IndexController extends Controller {
     
     
        public function index(){
                $prize=array(
                    array('id'=>1,'name'=>'苹果电脑','chance'=>1),
                    array('id'=>2,'name'=>'苹果手机','chance'=>2),
                    array('id'=>3,'name'=>'1000元购物卡','chance'=>3),
                    array('id'=>4,'name'=>'300元餐具','chance'=>4),
                    array('id'=>5,'name'=>'100元手机充值卡','chance'=>5)
                );
                $prize_form[0]=array('id'=>0,'name'=>'谢谢参与!');
                foreach ($prize as $key => $value) {
                    //格式化数组
                    $prize_form[$value['id']]=$value;
                    if($value['chance']>0){
                        $p[$value['id']]=$value['chance'];
     
                    }
                    
                }
     
                $result=$this->get_rand($p);
     
                echo $prize_form[$result]['name'];
        }
     
        /*
        *奖项的ID不得为0,0默认为谢谢参与
        *$proArr=array('1'=>'1','2'=>2)
        **/
        
        private function get_rand($proArr)
        {
            //奖项数量
            $prize_number=count($proArr);
            foreach ($proArr as $key => $value) {
                
                for($i=0;$i<$value;$i++){
                    //生成得奖球
                    $seekGroup[]='P'.$key;
     
                }
            }
          
            $chance_sum=array_sum($proArr);
            //干扰球数量
            $disturb_number=$prize_number*100-$chance_sum;
            //生成干扰球
            $disturb=range(1,$disturb_number);
            //将球放入篮子里
            $basket=array_merge($seekGroup,$disturb);
            shuffle($basket);
            //抽奖
            $rand=rand(0,$prize_number*100-1);
            if(strstr($basket[$rand], "P")){
                $result=str_replace('P', '', $basket[$rand]);
            }else{
                $result=0;
            }
     
            return $result;
        }
     
     
     
     
     
    }
    ?>

    balas
    0
  • ringa_lee

    ringa_lee2017-04-11 10:42:37

    这个问题比较好解决哈,假设有100个奖品,发放对象也有100个人,对这100个奖品进行编号叫award0-99,对发放对象的100个人进行编号叫person0-99,代码实现如下:

    <?php
    /**
     * 关注微信公众号:phpgod.
     * User: PHP技术大全
     * Date: 2016/10/9
     * Time: 9:47
     */
    $list = range(0,99);
    $awardList = $list;
    $personList = $list;
    shuffle($awardList);
    shuffle($personList);
    
    $targetAwardResult = array_combine($awardList,$personList);
    
    var_export($targetAwardResult);

    balas
    0
  • 迷茫

    迷茫2017-04-11 10:42:37

        /**
         * 随机算法
         *
         * @param array 需要随机的一维数组
         *              ['10', '20', '30']
         *
         * @return str 返回数组中的一个值
         *             10
         */
        public function __getRand($pro_arr) {
            $result = '';
            // 概率数组的总概率精度
            $pro_sum = array_sum($pro_arr);
    
            // 概率数组循环
            foreach ($pro_arr as $key => $pro_cur) {
                $rand_num = mt_rand(1, $pro_sum);
                if ($rand_num <= $pro_cur) {
                    $result = $key;
                    break;
                } else {
                    $pro_sum -= $pro_cur;
                }
            }
    
            unset ($pro_arr);
            return $result;
        }

    balas
    0
  • Batalbalas