PHP 大转盘抽奖思路_按权重抽奖

应该不难理解,比如概率数组['50','100','300']

他们一共是 '450' 份,'50' 在它们当中占'50'份

将这个数组循环,抽取一个 1-450 的随机数,如果在 50的范围内,那么就选中了50

如果没有选中50,那么就把 '50' 剔除出去,看数组 ['100','300'],再接着上面的方法去找

 1 // 按权重抽奖
 2 function get_rand($proArr)
 3 {
 4     $result = '';
 5 
 6     // 概率数组的总概率精度
 7     $proSum = array_sum($proArr);
 8 
 9     // 概率数组循环
10     foreach ($proArr as $key => $proCur) {
11         $randNum = mt_rand(1, $proSum);  // 返回随机整数
12         if ($randNum <= $proCur) {
13             $result = $key;
14             break;
15         } else {
16             $proSum -= $proCur;
17         }
18     }
19     unset($proArr);
20     return $result;
21 }
22 
23 $arr = [
24     // 奖项id => 奖项权重
25     '1' => 50,
26     '2' => 100,
27     '3' => 300
28 ];
29 
30 $randId = get_rand($arr); // 返回,即为随机抽取的奖品ID

 

posted @ 2021-03-04 21:26  九鹤  阅读(473)  评论(0编辑  收藏  举报