首頁  >  文章  >  後端開發  >  php抽獎演算法

php抽獎演算法

WBOY
WBOY原創
2016-10-10 11:56:251128瀏覽

萬能的大神們有什麼比較好的抽獎演算法。

回覆內容:

萬能的大神們有什麼比較好的抽獎演算法。

return false

這是我之前寫的。網路上用流行的是兩種演算法,機率太高了。只好回歸到課本裡面的,直接把所有中獎的球和乾擾球放到籃子裡面,隨機抽插。
而且抽獎直接抽,無需放回,我們只要再出獎後,獎品如果沒了,就直接當成謝謝參與來出獎。

<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