ホームページ > バックエンド開発 > PHPの問題 > PHPで非反復乱数を実装する方法

PHPで非反復乱数を実装する方法

藏色散人
リリース: 2023-03-07 08:40:02
オリジナル
3821 人が閲覧しました

php メソッドで非反復乱数を実装します。まず変数を 0 に初期化し、次に新しい配列を作成します。次に、特定の範囲内の数値をランダムに生成して配列に入れ、重複する値を削除します。配列内; 最後に、配列に新しいキー名を付けるだけです。

PHPで非反復乱数を実装する方法

推奨: 「PHP ビデオ チュートリアル

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;
	}
ログイン後にコピー

この方法は、毎回乱数を取得し、重複排除する前に配列に格納します...非効率です...使いたくないです

m n の範囲を効率的に生成する PHP (m<=n) 内の非反復乱数

注: これは、書籍 「Programming Pearls」# にも記載されています。 ##、タイトル 「n (m<=n) の範囲で m 個の非繰り返し乱数を効率的に生成する方法」

このアルゴリズムは、次の点を考慮する点で非常に賢いです。乱数そのものを取得するのではなく、乱数の位置 (配列の添え字 <span style="color:#ff6820; background-color:rgb(252,245,239)"></span>) 乱数が取得されるたびに、次のようになります。数値から選択することで、乱数の選択が一度で完了するので効率的です。

function rand_num($num=&#39;200&#39;){
	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 は、配列 $rand の現在位置の 添字に対応する キー i の値として使用されます。配列内の キー 添字に対応する $rand の値は、実際には である i に置き換えられます。 配列キー値の相互交換。意味は、生成された乱数 を値の範囲 [ i,$num-1] から除外し、次回は残りの数値 [ i 1,num-1 ]

3. 3 番目の ステップ では、値の繰り返しを避けるために、変更されていないキーと値のペアに対して交互の操作のみを実行します。つまり、それらを元の配列に順番に配置します。 (key == value) 位置を交互に操作します。

4.終わり。

配列を順番に並べる部分交換処理

上に示したように、10 個の乱数部分テスト例を取得します。

以上がPHPで非反復乱数を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
php
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート