PHP宝くじアルゴリズム

WBOY
WBOYオリジナル
2016-06-23 13:37:361413ブラウズ

宝くじを書くことは、確率から始めることに他なりません。各レベルの賞品の確率は、重みの合計の割合です

$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 "


";
echo "Second=".floatval($second)/100000;
echo "
";
echo "third="。 floatval($third)/100000;

?>

テスト済み データが大きいほど、結果は数学的期待に近づきます。つまり、対応する重量が総重量のパーセンテージを占めます。


🎜🎜
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。