ホームページ  >  記事  >  バックエンド開発  >  PHPで反復せずに乱数を取得するにはどうすればよいですか?

PHPで反復せずに乱数を取得するにはどうすればよいですか?

coldplay.xixi
coldplay.xixiオリジナル
2020-07-23 13:35:453691ブラウズ

重複のない乱数を取得する

php メソッド: 1. [rand(min,max)] 関数を使用して乱数を生成します; 2. [array_unique(arr)] を使用して生成された配列の重複を排除します; 3.インデックスを使用して、一意の乱数をすばやく生成します。

PHPで反復せずに乱数を取得するにはどうすればよいですか?

反復せずに乱数を取得するための php メソッド:

最初に思い浮かぶのは、 です。 rand(min, The max) 関数は乱数を生成します。実際、mt_rand(min,max) を使用すると、より迅速に乱数を生成できます。

2 番目に、array_unique(arr) を使用して、生成された配列の重複を排除します。実際、array_flip(array_flip(arr)) を使用すると、より迅速に重複を排除できます。

上記 2 つの点を理解すると、わずかに最適化された関数を作成できます。

/**
 * 生成指定长度不重复的字符串.
 *
 * @param integer $min 最小值.
 * @param integer $max 最大值.
 * @param integer $len 生成数组长度.
 *
 * @return array
 */
function uniqueRandom($min, $max, $len)
{
    if ($min < 0 || $max < 0 || $len) {
        throw new LogicException(&#39;无效的参数&#39;);
    }
    if ($max <= $min) {
        throw new LogicException(&#39;大小传入错误&#39;);
    }
    $counter = 0;
    $result = array();
    while ($counter < $len) {
        $result[] = mt_rand($min, $max);
        $result = array_flip(array_flip($result));
        $counter = count($result);
    }
    shuffle($result);
    return $result;
}

実際、インデックスを使用すると、非反復乱数をより迅速に生成でき、効率は数倍になります。上記の機能よりも何倍も優れています。

/**
 * 生成指定长度不重复的字符串.
 *
 * @param integer $min 最小值.
 * @param integer $max 最大值.
 * @param integer $len 生成数组长度.
 *
 * @return array
 */
function uniqueRandom2($min, $max, $len)
{
    if ($min < 0 || $max < 0 || $len < 0) {
        throw new LogicException(&#39;无效的参数&#39;);
    }
    if ($max <= $min) {
        throw new LogicException(&#39;大小传入错误&#39;);
    }
    if (($max - $min + 2) < $len) {
        throw new LogicException("传入的范围不足以生成{$len}个不重复的随机数}");
    }
    $index = array();
    for ($i = $min; $i < $max + 1; $i++) {
        $index[$i] = $i;
    }
    $startOne = current($index);
    $endOne = end($index);
    for ($i = $startOne; $i < $endOne; $i++) {
        $one = mt_rand($i, $max);
        if ($index[$i] == $i) {
            $index[$i] = $index[$one];
            $index[$one] = $i;
        }
    }
    return array_slice($index, 0, $len);
}

上記のアルゴリズムと比較したこのアルゴリズムの巧妙な点は次のとおりです。

  • 自己増加インデックスをランダム化するため、重複の問題が発生せず、重複排除が回避されます。オーバーヘッド

  • 配列の添字を使用して、配列自体をランダム化のために置き換えます。乱数が取得されるたびに、値の範囲から除外されます。次回は、その値のみが含まれます。乱数の取得、選択は 1 回の走査で完了できます。

関連する学習に関する推奨事項: PHP プログラミングの入門から熟練度まで

以上がPHPで反復せずに乱数を取得するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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