PHP抽獎演算法

來源:互聯網
上載者:User

標籤:

寫抽獎無非就是從機率入手,每個層次的獎的機率是該權重總權重的百分比

$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抽獎演算法

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.