>백엔드 개발 >PHP 튜토리얼 >PHP 복권 알고리즘

PHP 복권 알고리즘

WBOY
WBOY원래의
2016-10-10 11:56:251174검색

전능하신 신들에게 더 좋은 복권 알고리즘이 있나요?

답글 내용:

전능하신 신들에게 더 좋은 복권 알고리즘이 있나요?

거짓 반환

이미 제가 예전에 썼던 글입니다. 인터넷에서 널리 사용되는 알고리즘은 두 가지가 있는데 확률이 너무 높습니다. 교과서로 돌아가서 승리공과 간섭공을 모두 바스켓에 넣고 무작위로 뽑아야 했습니다.
그리고 추첨은 돌려보내지 않고 바로 추첨됩니다. 경품은 다시 추첨된 후에만 주시면 됩니다. 경품이 없어지면 참여에 대한 감사의 표시로 바로 지급됩니다.

<code><?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;
    }
 
 
 
 
 
}
?></code>

이 문제는 100개의 상품과 100명의 상품이 배포된다고 가정해 보겠습니다. 100개의 상품은 award0~99로 번호가 매겨져 있고, 100명의 상품이 배포되는 사람은 person0~99로 번호가 매겨져 있습니다. 코드는 다음과 같이 구현됩니다.

<code><?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);</code>
성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.