初期段階ではこれらのニーズに基づいて、次にインターネット上の情報に基づいて、段階的な抽出方法が採用されました。プログラム全体を見てみましょう。このプログラムは、一部の ThinkPHP フレームワークの下で完成しています。フレームワークに付属するクラスライブラリと関数について、以下で一つずつ説明していきます
宝くじアルゴリズムが満たす必要がある要件は次のとおりです:
1. 当選確率をコントロールできます
2.ランダム性あり
3. 賞品の数を管理するのが最善です
4. ユーザーIDまたはIP、携帯電話番号、QQ番号、その他の条件に基づいて抽選数を制限します
初期段階ではこれらのニーズに基づいて、次にインターネット上の情報に基づいて、段階的な抽出方法が採用されました。全体的な手順を見てみましょう。
コードは次のとおりです | |
/** * * * @lanfengye */ class ChojiangAction はアクション { を拡張します //抽選開始時間 var $begin_time="2012-12-25 14:00:00"; //開始時間 0 - 制限なし //抽選終了時間 var $stop_time="0" //終了時間 0 - 制限なし ; //この宝くじの賞品情報は、大きい順に入力する必要があります。id は賞番号、prise は当選情報、v は当選確率、num は賞品の数です。 //これには勝てないことに関する情報も含まれている必要があり、確率は小さいものから大きいものへと並べ替えられることに注意してください var $prize_arr = array( '0' => array('id' => 1, '賞品' => '1G/年スペースを44元で購入', 'v' => 1,'num'=>1), '1' => array('id' => 2, '賞品' => '1G/年スペースを55元で購入', 'v' => 2,'num'=>2), '2' => array('id' => 3, 'prize' => '1G/年スペースを66元で購入', 'v' => 5,'num'=>2), '3' => array('id' => 4, 'prize' => '1G/年スペースを77元で購入', 'v' => 10,'num'=>3), '4' => array('id' => 5, 'prize' => '1G/年スペースを88元で購入', 'v' => 15,'num'=>4), '5' => array('id' => 6, 'prize' => '1G/年スペースを99元で購入', 'v' => 67,'num'=>10), ); //ホームページの表示方法 パブリック関数index(){ //データベースに接続して、今回の勝者のリストを取得します $Chojiang=M('Chojiang'); $this->assign('list', $Chojiang->where("rid>0")->order('id desc')->select()); unset($Chojiang); //ホームページに抽選開始時間を表示 $this->assign('begin_time',$this->begin_time); $this->display(); } /** * 当選情報を生成し、Ajax を使用してこのメソッドをリクエストし、顧客は QQ 番号を入力する必要があります */ パブリック関数 make() { $qq_no= トリム($_POST['qq_no']); Import('ORG.Util.Input'); $qq_no=Input::getVar($qq_no); if(空($qq_no)){ $this->ajaxReturn(1, 'QQ 番号を正しく入力してください!'); 終了します; } If(!empty($this->begin_time) && time() $this->ajaxReturn(1, '抽選はまだ始まっていません。開始時間は次のとおりです:'.$this->begin_time); 終了します; } If(!empty($this->stop_time) && time()>strtotime($this->stop_time)){ $this->ajaxReturn(1, 'この宝くじは終了しました。終了時間は次のとおりです:'.$this->stop_time); 終了します; } //プライベートメンバーから賞情報の配列を取得します $ prize_arr = foreach ($prize_arr as $key => $val) { $arr[$val['id']] = $val['v']; } //$rid の当選シリアル番号 $rid = $this->get_rand($arr) //確率に基づいて特典 ID を取得します ; $str = $prize_arr[$rid - 1]['prize'] //賞品を獲得します ; $Chojiang=M('Chojiang'); //特定の QQ 番号が宝くじに参加した回数をデータベースから取得します。それが 3 以上の場合、プロンプトの数は使い果たされています 。 If($Chojiang->where("qq_no='{$qq_no}'")->count()>=3){ $str='3 回の抽選の機会はなくなりました。 '; $rid=0; // データベースから特定の賞のシリアル番号を取得する回数が、設定された最大回数以上の場合は、常に最後に賞品を獲得する必要があることを示すプロンプトが表示されます。記念賞、この場所を修正するだけです }elseif ($Chojiang->where("rid={$rid}")->count()>=$prize_arr[$rid-1]['num']) { $ Str = '申し訳ありませんが、抽選した賞品はすべて終了しました。 '; $rid=0; } // データベースに記録するためのユーザー宝くじデータを生成します $data=array( 'rid'=>$rid, 'pop'=>$str, 「qq_no」=>$qq_no, 'input_time'=>time() ); //ユーザー抽選情報の配列をデータベースに書き込みます $Chojiang->add($data); unset($Chojiang); //ajax 戻り情報 $this->ajaxReturn(1, $str); } /** * 確率に基づいて当選番号を取得します */ プライベート関数 get_rand($proArr) { $result = ''; //確率配列の合計確率精度 $proSum = array_sum($proArr); //確率配列ループ foreach ($proArr as $key => $proCur) { $randNum = mt_rand(1, $proSum); if ($randNum $result = $key; 休憩; } else { $proSum -= $proCur; } } unset($proArr); return $result; } } ?> |
このアルゴリズムは使いやすく、非常に優れた同時アクセスパフォーマンスを備えており、ユーザーのログイン情報やその他の情報と組み合わせることで、各人の描画数を効果的に制御できます。開始と終了を配列に変更することで、毎日特定の時間にくじを引くプログラムが完成します。
を作成しています。