標籤:
寫抽獎無非就是從機率入手,每個層次的獎的機率是該權重總權重的百分比
$arr = array(
array(‘prize‘=>‘first‘, ‘weight‘=>10),
array(‘prize‘=>‘second‘,‘weight‘=>10),
array(‘prize‘=>‘third‘, ‘weight‘=>80)
//權重依次排下來,權重保證為整型
);
分析上列資料。
權重加起來=100
所以只能取1到100的隨機值
由於1到100的區間內值的機率都是相等的
我們可以這樣處理
[1- 10]
[11-20]
[21-100]
假設使用者取到隨機值15
經過一等獎 發現大於一等獎的權重,15-10=5
然後經過二等獎,5小於二等獎的權重10,所以為二等獎。
這裡的核心是以區間為主,從小的權重到大的權重依次遍曆。而不該採取hash map浪費資源,代碼如下:
<?php
$arr = array(
array(‘prize‘=>‘first‘, ‘weight‘=>10),
array(‘prize‘=>‘second‘,‘weight‘=>10),
array(‘prize‘=>‘third‘, ‘weight‘=>80)
//權重依次排下來,權重保證為整型
);
function LotteryDraw($arr){
$weightSum = 0;
foreach($arr as $rows){
$weightSum +=$rows[‘weight‘];//總權重相加
}
$randomNumber = rand(1,$weightSum);//獲得隨機數
foreach($arr as $rows){
if($randomNumber <= $rows[‘weight‘]){
return $rows[‘prize‘];
}
else{
$randomNumber -= $rows[‘weight‘];
}
}
}
//越多次實驗越接近權重
$first = $second = $third = 0;//次數置0
for($i = 0; $i<100000; $i++){
$res = LotteryDraw($arr);
if( $res == "first"){
$first++;
}else if( $res == "second"){
$second++;
}else{
$third++;
}
}
echo "First=".floatval($first)/100000;
echo "<hr>";
echo "Second=".floatval($second)/100000;
echo "<hr>";
echo "third=".floatval($third)/100000;
?>
測試的資料越大,結果越接近數學期望。即相應權重佔總權重百分比。
PHP抽獎演算法