宝くじを書くことは、確率から始めることに他なりません。各レベルの賞品の確率は、重みの合計の割合です
$arr = array(
array('prize'=>'first)。 ', '体重'=> 10),
array('賞'=>'2位','体重'=>10),
array('賞'=>'3位', '体重'= >80)
//重み それらを順番に並べると、重みは整数になることが保証されます
);
上記のデータを分析します。
重みの合計 = 100
したがって、1から100までのランダムな値しか取得できません
1から100までの範囲内の値の確率はすべて等しいため、
次のように処理できます
これ
[1- 10]
[ 11-20]
[21-100]
ユーザーがランダムな値 15 を取得したとします
1 等賞の後、重みが 1 等よりも大きいことがわかります賞、15-10=5
2等の次は、5が2等より小さいです。 2等の重みは10なので、2等です。
ここでの核心は、小さなウェイトから大きなウェイトまで横断するインターバルに焦点を当てることです。ハッシュ マップを使用してリソースを無駄にする代わりに、コードは次のようになります:
$arr = array(
array('prize'=>'first', 'weight'=>10),
array('prize'=>'first','weight'=>10),
array('prize'=>'three', 'weight'=>80)
//重みは次のようにランク付けされます順序、重みは整数型であることが保証されます
);
function LottoryDraw($arr){
$weightSum = 0;
foreach($arr as $rows){
$weightSum +=$rows['weight'] ;//合計の重みが追加されます
}
$randomNumber = rand(1,$weightSum);//乱数を取得します
foreach($arr as $rows){
if($randomNumber <= $rows[' Weight']){
return $rows[' priority'];
}
else{
$randomNumber -= $rows['weight'];
}
}
}
// 実験が多ければ多いほど、 Weight
$first = $second = $third = 0; //回数を0に設定
for($i = 0; $i<100000; $i++){
$res = LottoryDraw($arr);
if( $res == "最初"){
$first++;
} else if( $res == "2 番目"){
$second++;
}else{
$third++;
}
}
echo "最初= ".floatval($first)/100000;
echo "
テスト済み データが大きいほど、結果は数学的期待に近づきます。つまり、対応する重量が総重量のパーセンテージを占めます。