抽獎概率算法


不同概率的抽獎原理就是把0到*(比重總數)的區間分塊

分塊的依據是物品占整個的比重,再根據隨機數種子來產生1-* 中的某個數

判斷這個數是落在哪個區間上,區間對應的就是抽到的那個物品。

隨機數理論上是概率均等的,那么相應的區間所含數的多少就體現了抽獎物品概率的不同

<?php
function getRand($proArr) {   
    $result = [];
    foreach ($proArr as $key => $val) { 
        $arr[$key] = $val['v']; 
    } 
    // 概率數組的總概率  
    $proSum = array_sum($arr);        
    asort($arr);
    // 概率數組循環   
    foreach ($arr as $k => $v) {   
        $randNum = mt_rand(1, $proSum);   
        if ($randNum <= $v) {   
            $result = $proArr[$k];   
            break;   
        } else {   
            $proSum -= $v;   
        }         
    }     
    return $result;
}

$arr = [   
    ['id'=>1, 'name'=>'特等獎', 'v'=>1],
    ['id'=>2, 'name'=>'一等獎', 'v'=>5),
    ['id'=>3, 'name'=>'二等獎', 'v'=>10],
    ['id'=>4, 'name'=>'三等獎', 'v'=>12],
    ['id'=>5, 'name'=>'四等獎', 'v'=>22],
    ['id'=>6, 'name'=>'沒中獎', 'v'=>50]
];  

$result = [];
for($i=0; $i<10000; $i++) {
    $rand = getRand($arr);
    isset($result[$rand['name']])? $result[$rand['name']]+=1: $result[$rand['name']] = 1;
}
asort($result);
var_dump($result);

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM