ランダム配列を生成するPHPのカプセル化方法
/* * array unique_rand( int $min, int $max, int $num ) * 生成一定数量的不重复随机数 * $min 和 $max: 指定随机数的范围 * $num: 指定生成数量 */ function unique_rand($min, $max, $num) { //初始化变量为0 $count = 0; //建一个新数组 $return = array(); while ($count < $num) { //在一定范围内随机生成一个数放入数组中 $return[] = mt_rand($min, $max); //去除数组中的重复值用了“翻翻法”,就是用array_flip()把数组的key和value交换两次。这种做法比用 array_unique() 快得多。 $return = array_flip(array_flip($return)); //将数组的数量存入变量count中 $count = count($return); } //为数组赋予新的键名 shuffle($return); return $return; }
この方法は、毎回乱数を取得し、重複排除する前に配列に格納します...非効率...使いたくない
PHP は効率的です n の範囲で m 個の非繰り返し乱数を生成します (m<=n)
注: これは、書籍「Programming Pearls」にも記載されています。 m n 範囲を効率的に生成するには" (m<=n) 内の非繰り返し乱数"
このアルゴリズムは、乱数 (配列の添字) の位置を非常に巧妙に取得します。乱数自体を取得するのではなく、乱数を取得した後はそのたびに値の範囲から除外され、次回は残りの数値からのみ選択されます。乱数の選択は 1 回の走査で完了できます。非常に効率的です。
function rand_num($num='200'){ for($i=0;$i<$num;$i++){ $n[$i] = $i; } for($i=0;$i<$num;$i++){ $rand = mt_rand($i,$num-1); //数组 随机数交换下标 if($n[$i] == $i){ $n[$i] = $n[$rand]; $n[$rand] = $i; } } }
1. 最初のステップは、添字の順序で配列内の各数値に値を割り当て、$num 個の数値キー値の配列を取得することです。対応する順序で配置されます。
2.2 番目のステップ では、範囲 [i, $num-1] の乱数 $rand の取得を開始し、取得した乱数 $rand を現在の値として使用します。配列。位置キー i は添字値 $rand に対応し、配列内のキー $rand の添字に対応する値は i に置き換えられます。これは実際には配列キー値の相互交換です。意味は、生成された乱数を値の範囲 [i,$num-1] から除外し、次回は残りの数値 [i 1,num-1] から値を取得することです。
3.3 番目のステップ は、値の繰り返しを避けるために、変更されていないキーと値のペア、つまり元の配列が連続して配置されている位置に対してのみ交互の操作を実行します。 (キー == 値) 交互に操作を実行します。
4.終了。
#上に示したように、10 個の乱数の部分例を取得します。 PHP 関連のその他の質問については、PHP 中国語 Web サイトをご覧ください:以上がPHP は一意の乱数を効率的に生成しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。