假設(shè)我們的獎(jiǎng)品是如下:
$prize = array(
'0' => array('id'=>1,'prize'=>'ipad','v'=>1),
'1' => array('id'=>2,'prize'=>'iphone9','v'=>5),
'2' => array('id'=>3,'prize'=>'小米音箱','v'=>10),
'3' => array('id'=>4,'prize'=>'4GU盤','v'=>12),
'4' => array('id'=>5,'prize'=>'10Q幣','v'=>22),
'5' => array('id'=>6,'prize'=>'下次沒準(zhǔn)就能中哦','v'=>50),
);
v表示中獎(jiǎng)?wù)急龋热缯f所有v加起來是100,而這里的ipad為1,表示中獎(jiǎng)概率為1%。
算法思路
$data
為一個(gè)預(yù)設(shè)的數(shù)組,假設(shè)數(shù)組為[100,200,300,400]
,最開始數(shù)據(jù)從1,1000這個(gè)范圍內(nèi)選一個(gè)數(shù)出來,如果不在這個(gè)范圍內(nèi),則縮小范圍,在這個(gè)例子中就是減去100,也就是第二個(gè)數(shù)在1,900這個(gè)范圍內(nèi)篩選,這樣一直下去總會(huì)有一個(gè)滿足要求。相當(dāng)于在一個(gè)盒子里拿小球,第一個(gè)不是,第二個(gè)不是,第三個(gè)不是。。。全部取完,總會(huì)有一個(gè)是。
function gen_rand($data) {
$result = '';
$sum = array_sum($data); //計(jì)算總權(quán)重
foreach($data as $key => $val) {
$randNum = mt_rand(1, $sum);
if($randNum <= $val) {
$result = $key;
break;
} else {
$sum -= $val;
}
}
unset($data);
return $result;
}
生成$data
數(shù)組的方法
$keys = array_keys($prize);
$vals = array_column($prize, 'v');
$data = array_combine($keys,$vals);