一個抽獎函數(自訂中獎項數和機率)
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
發布: 2016-07-25 08:50:29
適用於抽獎系統
-
- /*
- * 一個抽獎類,精確到萬分之一
- * 三個步驟:1.接受一個中獎機率數組;2 .接受一個抽獎種子;3.返回中獎等級
- */
-
- class Lottery {
- /*
- * 中獎概率數組,自動判斷獎項數目
- * 數組鍵值和為100,自動計算出不中獎的機率,若初始是超過100拋出一個錯誤
- */
-
- protected $_rate = array();
-
- /*
- * 設定中獎機率,
- * @param Array,中獎機率,以陣列形式傳入
- */
-
- public function setRate($rate = array(12.1, 34)) {
- $this->_rate = $rate;
- if (array_sum($this->_rate) > 100)//偵測機率設定是否有問題
- throw new Exception('Winning rate upto 100%');
- if (array_sum($this->_rate) //定義未中獎情況的機率,使用者給的機率只和為100時,則忽略0
- $this->_rate[] = 100 - array_sum($this->_rate);
- }
-
- /*
- * 隨機產生一個1-10000的整數種子,提交給中獎判斷函數
- * @return int ,依傳入的機率排序,回傳中獎的項數
- */
-
- public function runOnce() {
- return $this->judge(mt_rand(0, 10000));
- }
-
- /*
- * 依設定的機率,判斷一個傳入的隨機值是否中獎
- * @param int,$seed 10000以內的隨機數
- * @return int,$i 依傳入的機率排序,傳回中獎的項數
- */
-
- protected function judge($seed) {
- foreach ($this->_rate as $key => $value) {
- $tmpArr[$key 1] = $value * 100;
- }
- //將機率乘十後累計,以便隨機選擇,組合成
- $tmpArr[0] = 0;
- foreach ($tmpArr as $key => $value) {
- if ($key > 0) {
- $tmpArr[$key] = $tmpArr[$key - 1];
- }
- }
- for ($i = 1; $i if ($tmpArr[$i - 1] return $i; //回傳中獎的項數(依機率的設定順序)
- }
- }
- }
-
- }
-
- $rate = array(33, 20, 2, 0.95, 12, 4.55);
-
- $a = new Lottery;
- $a->setRate($$);
- for ($i = 0; $i $b = $a->runOnce();
- @$rewards[$b] ;
- }
- unset($rewards['']);
- echo array_sum($rewards);
- ?>
-
-
-
-
-
-
- 運行10000次,對比設定機率與中獎次數
-
設定機率 |
中獎次數 |
-
% |
|
-
% |
|
-
% |
|
-
% |
|
-
% |
-
% |
|
-
|
|
-
-
-
-
-
-
複製程式碼
|
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
-
2024-10-22 09:46:29
-
2024-10-13 13:53:41
-
2024-10-12 12:15:51
-
2024-10-11 22:47:31
-
2024-10-11 19:36:51
-
2024-10-11 15:50:41
-
2024-10-11 15:07:41
-
2024-10-11 14:21:21
-
2024-10-11 12:59:11
-
2024-10-11 12:17:31