宝くじプログラムやランダム広告に適した PHP 確率アルゴリズムの例_PHP チュートリアル

WBOY
リリース: 2016-07-13 10:34:28
オリジナル
1265 人が閲覧しました

次に、プログラム内でアルゴリズムを設計します。つまり、ユーザーが一定の確率に従って賞品を獲得できるようにします。まず 2 つの確率アルゴリズム関数を見てみましょう。

アルゴリズム1

コードをコピー コードは次のとおりです:

/**
* 全確率計算
*
* @param array $p array('a'=>0.5,'b'=>0.2,'c'=>0.4)
* @return string のキーを返します。上の配列
*/
function random($ps){
static $arr = array();
$key = md5(serialize($ps));

if (!isset($arr[$key])) {
$max = array_sum($ps);
foreach ($ps as $k=>$v) {
$v = $v / $max * 10000; (for ($ i = 0; $ i & lt; $ v; $ i ++) $ arr [$ key] [] = $ k; $arr[$key])-1)];
}


アルゴリズム 2



コードをコピー
コードは次のとおりです:function get_rand($proArr) { $result = ''; //確率配列の合計確率精度
$proSum = array_sum($proArr);
= $ key;
Return $result; }


上記のコードは、配列が配列 (100,200,300,400) であると仮定します。 1000。数値はその出現確率の範囲内にありますか? そうでない場合は、k の値から先ほどの数値の確率空間を引いた値が減算されます。この場合、マイナス 100 になります。たとえば、k の値はマイナス 100 です。2 つの数値は 1,900 の範囲内でスクリーニングされます。このようにして、最後まで要件を満たす数が必ず存在します。それは、箱の中の何かに触れるようなものです。最初のものがそこになく、2 つ目も存在せず、3 つ目も存在しない場合は、最後のものが存在するはずです。このアルゴリズムはシンプルで非常に効率的です。重要なのは、このアルゴリズムが以前のプロジェクト、特に大量のデータを含むプロジェクトに適用されているということです。

次に、PHP を通じて賞を設定します。




コードをコピー

コードは次のとおりです:


$prize_arr = array(
'0' => array('id'=>1,'prize'=>'tablet',' v' =>1),
'1' => array('id'=>2,'賞品'=>'デジタルカメラ','v'=>5),

'2' = > array('id'=>3,'賞品'=>'スピーカー機器','v'=>10),

'3' =>4,'賞品' =>'4G USB フラッシュ ドライブ','v'=>12),
'4' => array('id'=>5,'賞品'=>'10Q コイン',' v'=> ;22),

'5' => array('id'=>6,'prize'=>'次回は当たるかもしれません','v'=>50),
) ;

は、この宝くじのすべての賞品情報を記録する 2 次元配列で、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等に当選した場合、最大数に達した場合は、対応する賞品の設定を解除して回避してください。繰り返される賞金
/ /ここにコード eg:unset($prize_arr['0'])
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]['prize']
}
$res['no'] = $pr;

なぜグランプリを受賞できないのですか?

同様の宝くじイベントの多くでは、参加者が大賞を獲得できないことがよくあります。私が宝くじイベントの主催者である場合、それぞれに賞品が異なる 6 つの賞品を設定しました。当選確率、1 等が高級車の場合、当選確率を 0 に設定しましたが、これは何を意味しますか?つまり、どれだけ抽選しても、抽選参加者はこの高級車を手に入れることはできないということだ。そして主催者が毎回残りのマス目を裏返すと、参加者は一等賞が今引いたマス目の隣の数字の下にあるかもしれないことに気づき、自分たちの不運を責めます。本当に運が悪いのでしょうか?実際、参加者がそのマスをめくったとき、プログラムはすでに賞品を決定していましたが、彼が他のマス目をめくって他のマスを見ると、彼が見た賞品は単なる*であり、聴衆と参加者を混乱させました。この記事を読んだ後は、テレビ番組のフリップ宝くじが難しいことが分かると思います。もう二度と 2 色のボールを選ぶためにマシンに行くことはないかもしれません。

http://www.bkjia.com/PHPjc/751513.html

www.bkjia.com

http://www.bkjia.com/PHPjc/751513.html技術記事次に、プログラム内でアルゴリズムを確実に設計します。つまり、ユーザーが一定の確率に従って賞を獲得できるようにします。まず 2 つの確率アルゴリズム関数を見てみましょう。 アルゴリズム 1 コードをコピーする コードは次のとおりです: /** * すべて...
関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート