ホームページ >バックエンド開発 >PHPチュートリアル >偉大な神の導きを求めてください
抽選条件:
1等は1,000個、2等は30万個、3等は30万個です。ランダムな賞品をすぐに捨てるにはどうすればよいですか?配列を使用し、配列に賞品を入れてからランダムに投げるこの方法は少し遅く感じられ、賞品を獲得するまでに 1 ~ 2 秒かかります。他に何か方法はありますか?
マスターの皆さんは新年を祝うために戻ってきましたか? アドバイスを待ってください!
テスト例
$ar = array(1 => 1000, 2 => 300000, 3 => 300000); //奖池while(array_sum($ar)) { $n = get_rand($ar); //得到奖项级别,可打印出来看看分布情况 @$res[$n]++;}print_r($res);//看看中奖分布print_r($ar); //看看奖池是否有剩余function get_rand(&$proArr) { $proSum = array_sum($proArr); $randNum = mt_rand(1, $proSum); foreach($proArr as $key => $proCur) { $proSum -= $proCur; if($randNum > $proSum) { $proArr[$key]--; //从奖池里扣除 return $key; } }}
Array( [2] => 300000 [3] => 300000 [1] => 1000)Array( [1] => 0 [2] => 0 [3] => 0)
私だったら... ユーザーまたは宝くじのコードをデータベースに入力し、フィールドを追加します。最後の「当選ステータス」は、0 = 当選しなかった、1 = 1等賞...
毎回、SQLのランダムステートメントを使用して、当選ステータスが0のユーザーを抽出し、更新します
Ifそれは確率に基づいた抽選であり、
$ar = array(1 => 10, 2 => 30, 3 => 60); //中奖概率for($i=0; $i<10000; $i++) { //抽奖1万次 $n = get_rand($ar); //得到奖项级别,可打印出来看看分布情况 @$res[$n]++;}print_r($res);//看看中奖分布function get_rand(&$proArr) { $proSum = array_sum($proArr); $randNum = mt_rand(1, $proSum); foreach($proArr as $key => $proCur) { $proSum -= $proCur; if($randNum > $proSum) { //$proArr[$key]--; //从奖池里扣除 因为是概率抽奖,这一句就不要了 return $key; } }}
Array( [3] => 5955 [2] => 3059 [1] => 986)の可能な結果です
マスター、皆さんは新年を祝うために戻ってきましたか?
テスト例
$ar = array(1 => 1000, 2 => 300000, 3 => 300000); //奖池while(array_sum($ar)) { $n = get_rand($ar); //得到奖项级别,可打印出来看看分布情况 @$res[$n]++;}print_r($res);//看看中奖分布print_r($ar); //看看奖池是否有剩余function get_rand(&$proArr) { $proSum = array_sum($proArr); $randNum = mt_rand(1, $proSum); foreach($proArr as $key => $proCur) { $proSum -= $proCur; if($randNum > $proSum) { $proArr[$key]--; //从奖池里扣除 return $key; } }}
Array( [2] => 300000 [3] => 300000 [1] => 1000)Array( [1] => 0 [2] => 0 [3] => 0)