>  기사  >  백엔드 개발  >  PHP에서 반복 없이 난수를 얻는 방법은 무엇입니까?

PHP에서 반복 없이 난수를 얻는 방법은 무엇입니까?

coldplay.xixi
coldplay.xixi원래의
2020-07-23 13:35:453691검색

PHP에서 반복 없이 난수를 얻는 방법: 1. [rand(min,max)] 함수를 사용하여 난수를 생성합니다. 2. [array_unique(arr)]를 사용하여 생성된 배열을 중복 제거합니다. 고유한 난수를 생성합니다.

PHP에서 반복 없이 난수를 얻는 방법은 무엇입니까?

PHP에서 반복 없이 난수를 얻는 방법:

가장 먼저 떠오르는 것은 실제로 난수를 생성하는 rand(min,max) 함수입니다. , mt_rand(min ,max)는 난수를 더 빠르게 생성할 수 있습니다. rand(min,max)函数产生随机数,实际上使用mt_rand(min,max)能更加迅速的产生随机数。

其次使用array_unique(arr)对生成的数组进行去重,实际上使用array_flip(array_flip(arr))

두 번째로, 생성된 배열의 중복을 제거하려면 array_unique(arr)를 사용하세요. 실제로 array_flip(array_flip(arr))을 사용하면 더 빠르게 중복을 제거할 수 있습니다.

위의 두 가지 사항을 이해하면 약간 최적화된 함수를 작성할 수 있습니다.

/**
 * 生成指定长度不重复的字符串.
 *
 * @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);
}

위 알고리즘과 비교하여 이 알고리즘의 영리함은 다음과 같습니다.
  • 자체 증가 인덱스를 무작위화하고 중복 문제가 없으며 중복 제거 오버헤드를 방지합니다.
  • 배열 자체를 배열로 교체합니다. subscript 무작위화를 수행하여 난수를 얻을 때마다 값 범위에서 제외됩니다. 다음 번에는 나머지 숫자만 선택됩니다.

관련 학습 권장사항: 초보부터 마스터까지 PHP 프로그래밍

🎜

위 내용은 PHP에서 반복 없이 난수를 얻는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.