ホームページ >バックエンド開発 >PHPチュートリアル >PHP_PHP チュートリアルで書かれた宝くじプログラムの当選確率アルゴリズム
この記事では、スクラッチカード、ビッグルーレット、その他の宝くじアルゴリズムに使用できるphp当選確率アルゴリズムを共有します。使い方は非常に簡単で、コード内に詳細なコメントが記載されているので、必要な方が参照できます。
最初にバックエンド PHP プロセスを完了します。PHP の主な仕事は、フロントエンド ページがクリックして特定のボックスを反転すると、バックエンド PHP に ajax リクエストを送信することです。バックエンド PHP は、設定された確率に基づいて確率を渡します。アルゴリズムは当選結果を与えると同時に、未当選の賞品情報を JSON データ形式でフロントエンド ページに送信します。
まずは確率計算関数を見てみましょう
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
関数 get_rand($proArr) { $結果 = '';
//確率配列の合計確率精度 $proSum = array_sum($proArr);
//確率配列ループ foreach ($proArr as $key => $proCur) { $randNum = mt_rand(1, $proSum); if ($randNum $result = $key; 休憩; } 他 { $proSum -= $proCur; } } 設定解除 ($proArr);
$result を返す; } |
上記のコードは、古典的な確率アルゴリズムです。$proArr は配列 (100,200,300,400) であると仮定します。最初の数値が確率範囲 1,1000 内に出現するかどうかを検査します。そうでない場合、確率空間、つまり k の値から今の数値の確率空間を差し引いた値、この場合はマイナス 100 です。これは、2 番目の数値が 1,900 であることを意味します。範囲内でフィルター処理されます。このようにして、最後まで要件を満たす数が必ず存在します。それは、箱の中の何かに触れるようなものです。最初のものがそこになく、2 つ目も存在せず、3 つ目も存在しない場合は、最後のものが存在するはずです。このアルゴリズムはシンプルで非常に効率的です。重要なのは、このアルゴリズムが以前のプロジェクト、特に大量のデータを含むプロジェクトに適用されているということです。
次に、PHP を通じて賞を設定します。
?
1 2 3 4 5 6 7 8 |
$prize_arr = 配列( '0' => 配列('id'=>1,'賞品'=>'タブレット','v'=>1), '1' => 配列('id'=>2,'賞品'=>'デジタルカメラ','v'=>5), '2' => array('id'=>3,'賞品'=>'スピーカーデバイス','v'=>10), '3' => 配列('id'=>4,'賞品'=>'4G USBフラッシュドライブ','v'=>12), '4' => 配列('id'=>5,'賞品'=>'10Q コイン','v'=>22), '5' => array('id'=>6,'prize'=>'次回は当たるかもしれません','v'=>50), ); |
この二次元配列は、この宝くじのすべての賞品情報を記録します。ここで、idは当選レベルを表し、priseは賞金を表し、vは当選確率を表します。 v は整数である必要があることに注意してください。対応する賞の v を 0 に設定できます。これは、賞を獲得する確率が 0 であることを意味します。配列 (基数) 内の v の合計は大きくなります。正確な確率を反映することができます。この例では、v の合計が 100 であるため、タブレットの当選確率は 1% になります。v の合計が 10,000 の場合、当選確率は 1 万分の 1 です。
フロントエンドページがリクエストされるたびに、PHPは特典設定配列をループし、確率計算関数get_randを通じて抽選された特典IDを取得します。当選賞品を配列 $res['yes'] に保存し、残りの非当選情報を $res['no'] に保存し、最後に json 数値データをフロントエンド ページに出力します。
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
foreach ($prize_arr as $key => $val) { $arr[$val['id']] = $val['v']; }
$rid = get_rand($arr) //確率に基づいて特典 ID を取得します
$res['yes'] = $prize_arr[$rid-1]['prize'] //賞品を獲得します ;unset($prize_arr[$rid-1]); //未獲得の賞品を残して、配列から当選賞品を削除します shuffle($prize_arr); //配列の順序を入れ替えます for($i=0;$i $pr[] = $prize_arr[$i]['賞']; } $res['no'] = $pr; echo json_encode($res); |
ネチズンの実装方法も添付します
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
/** * お楽しみ抽選会 * @param int $total */ 関数getReward($total=1000) { $win1 = フロア((0.12*$total)/100); $win2 = フロア((3*$合計)/100); $win3 = フロア((12*$total)/100); $other = $total-$win1-$win2-$win3; $return = array(); ($i=0;$i { $return[] = 1; } for ($j=0;$j { $return[] = 2; } ($m=0;$m { $return[] = 3; } for ($n=0;$n { $return[] = 'ご愛顧ありがとうございます'; } シャッフル($return); return $return[array_rand($return)]; } $data = getReward(); $data をエコー; ?> |
以上がこの記事の全内容ですが、皆さんに気に入っていただければ幸いです。