ホームページ >バックエンド開発 >PHPの問題 >PHPの乱数は繰り返されません

PHPの乱数は繰り返されません

(*-*)浩
(*-*)浩オリジナル
2019-09-17 13:56:322503ブラウズ

PHP は、n (m

PHPの乱数は繰り返されません

##注: これは書籍「Programming Pearls」にも記載されており、タイトルは「n の範囲で m 個の非繰り返し乱数を効率的に生成する方法 (mGetting PHP プログラミングで始める マスターへ )

このアルゴリズムは、乱数そのものを取得するのではなく、乱数の位置 (配列の添字) を非常に巧妙に取得します。が選択された場合は、値の範囲から除外し、次回は残りの数値のみが選択されます。乱数の選択は 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 番目のステップでは、値の繰り返しを避けるために、変更されていないキーと値のペアに対してのみ交互操作を実行します。つまり、元の配列が順番に配置されている位置に対して交互操作を実行します (key = = 値)。

4.終了。

PHPの乱数は繰り返されません

以上がPHPの乱数は繰り返されませんの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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