抽選システムに最適
- /*
- * 1 万分の 1 まで正確な宝くじカテゴリ
- * 3 つのステップ: 1. 当選確率の配列を受け入れる; 2. 宝くじのシードを受け入れる; 3. 当選レベルを返す
- * /
- class Lottory {
- /*
- * 当選確率の配列、賞品の数を自動的に決定します
- * 配列のキー値の合計が 100 で、当選しない確率を自動的に計算します、初期値が 100 を超える場合、エラーがスローされます
- */
- protected $_rate = array();
- /*
- * 勝つ確率を設定します
- * @param 配列、勝つ確率、配列として渡されます
- */
- public function setRate($rate = array(12.1, 34) ) {
- $this->_rate = $rate;
- if (array_sum($this->_rate) > 100)//問題があるかどうかを検出確率設定を使用して
- throw new Exception('勝率最大 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;
- }
- //確率を 10 倍し、ランダム選択のために累積し、
- に結合 $tmpArr[0] = 0;
- foreach ($tmpArr as $key => $value) {
- if ($key > 0) {
- $tmpArr[$key] += $tmpArr[$key - 1];
- }
- }
- for ($i = 1; $i if ($tmpArr[$i - 1] < $seed && $seed < = $tmpArr[$i]) {
- return $i を返す (設定順)確率)
- }
- }
- }
- }
- $rate = array(33, 20, 2, 0.95, 12, 4.55);
- $a = 新しい宝くじ;
- $a->setRate($rate) ;
- for ($i = 0; $i <= 10000; $i++) {
- $b = $a->runOnce();
- @$rewards[$b]++;
- }
- unset($報酬['']);
- echo array_sum($rewards);
- ?>
-
-
-
-
-
-
- 10,000 回実行し、設定された確率と賞金の数を比較します
-
< ;th>確率を設定獲得数 |
-
% | |
-
% | | < ?php echo $rate[2]; ?>% | |
-
% | |
-
%< /td> | td> |
-
% | |
-
| |
-
-
-
-
-
コードをコピー
|