전능하신 신들에게 더 좋은 복권 알고리즘이 있나요?
전능하신 신들에게 더 좋은 복권 알고리즘이 있나요?
거짓 반환
이미 제가 예전에 썼던 글입니다. 인터넷에서 널리 사용되는 알고리즘은 두 가지가 있는데 확률이 너무 높습니다. 교과서로 돌아가서 승리공과 간섭공을 모두 바스켓에 넣고 무작위로 뽑아야 했습니다.
그리고 추첨은 돌려보내지 않고 바로 추첨됩니다. 경품은 다시 추첨된 후에만 주시면 됩니다. 경품이 없어지면 참여에 대한 감사의 표시로 바로 지급됩니다.
<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>