-
- /**
- * 全確率の計算
- *
- * @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<$v; $i++) $arr[$key][] = $k;
- }
- }
- return $arr[$key][mt_rand(0,count($arr) [$key])-1)];
- }
コードをコピー 例 2、PHP 宝くじプログラム アルゴリズム 2
- function 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;
- }
-
-
コードをコピー
上記のコードは、古典的な確率アルゴリズムです。プリセット配列。配列が配列 (100、200、300、400) であると仮定すると、最初の数値が 1,1000 の確率範囲からスクリーニングされ、その出現確率範囲内にあるかどうかが確認されます。そうでない場合は、確率が減少します。つまり、確率空間は k の値から先ほどの数値を引いたもので、この場合はマイナス 100 になります。つまり、2 番目の数値は 1,900 の範囲内でフィルターされます。このようにして、最後まで要件を満たす数が必ず存在します。それは、箱の中の何かに触れるようなものです。最初のものがそこになく、2 つ目も存在せず、3 つ目も存在しない場合は、最後のものが存在するはずです。
このアルゴリズムはシンプルで非常に効率的です。重要なのは、このアルゴリズムが以前のプロジェクト、特に大量のデータを含むプロジェクトで適用されているということです。
|