中獎轉盤抽獎參考原文鏈接 https://www.helloweba.com/view-blog-216.html
翻牌子抽獎參考原文鏈接 https://www.helloweba.com/view-blog-184.html
最近接觸到一些翻牌,抽獎的問題,然後就上網查找了一些計算概率的方法,自己試了試,下邊爲例子說明
/** * 獎項配置中獎的概率一級中獎等級配置 */ public function actionCeshi() { $prize_arr = array( '0' => array('id' => 1, 'prize' => '平板電腦', 'v' => 1), '1' => array('id' => 2, 'prize' => '數碼相機', 'v' => 5), '2' => array('id' => 3, 'prize' => '音箱設備', 'v' => 10), '3' => array('id' => 4, 'prize' => '4G優盤', 'v' => 12), '4' => array('id' => 5, 'prize' => '10Q幣', 'v' => 22), '5' => array('id' => 6, 'prize' => '下次沒準就能中哦', 'v' => 50), ); foreach ($prize_arr as $key => $val) { $arr[$val['id']] = $val['v']; /* $arr = Array ( [1] => 1, [2] => 5, [3] => 10, [4] => 12, [5] => 22, [6] => 50, );*/ } $rid = $this->Lists($arr); //根據概率獲取獎項id $res['yes'] = $prize_arr[$rid - 1]['prize']; //中獎項 unset($prize_arr[$rid - 1]); //將中獎項從數組中剔除,剩下未中獎項 shuffle($prize_arr); //打亂數組順序 for ($i = 0; $i < count($prize_arr); $i++) { $pr[] = $prize_arr[$i]['prize']; } $res['no'] = $pr; // 除了中獎外的其他數據 echo json_encode($res); } /** * 隨機算法 計算中獎率 * * @param array 需要隨機的一維數組 * ['10', '20', '30'] * * @return str 返回數組中的一個值 * 10 */ public function Lists($pro_arr) { /* $pro_arr = Array ( [0] => 10, [1] => 20, [2] => 30, );*/ $result = ''; // 概率數組的總概率精度 $pro_sum = array_sum($pro_arr);//60 // 概率數組循環 foreach ($pro_arr as $key => $pro_cur) { $rand_num = mt_rand(1, $pro_sum);//生成1-60的隨機數,mt_rand(min,max) if ($rand_num <= $pro_cur) {//如果生成的隨機數小於等於10,20,30的值 $result = $key;//則result等於0,1,2的key值 break; } else { $pro_sum -= $pro_cur;//60-=10,20,30 } } unset ($pro_arr); return $result; }