PHP를 사용하는 [최소-최대] 범위의 난수


84

최소값과 최대 값을 기준으로 난수를 생성하는 방법이 있습니까?

예를 들어, min이 1이고 max 20이라면 1과 20을 포함하여 1과 20 사이의 숫자를 생성해야합니까?


1
새로운 PHP 버전에는 암호화 된 보안 난수 생성기가 있습니다.
Salvador Dali

1
PHP 7 이상 random_int()에서는 random_bytes(), 또는 openssl_random_pseudo_bytes() . @Salvador Dali가 말했듯 rand()이 암호 학적으로 안전한 결과를 생성하지 마십시오. 참조 문서 php.net/manual/en/function.rand.php
FrozenFire

답변:


147
<?php
  $min=1;
  $max=20;
  echo rand($min,$max);
?>

나는 rand의 최소와 최대가 숫자 대신 사용할 자릿수라고 생각했습니다. :) thnx
Val

관련 : 이 답변에PHP_INT_MAX < ($max-$min) 설명 된대로 간격을 함께 추가해야하는 경우 .
비숍

PHP7.1 이전의 rand ()는 단순히 나쁘다. 예측 가능한 결과를내는 LCG 알고리즘을 사용합니다. 또한 느립니다. PHP7.1 rand ()가 mt_rand ()의 별칭이되었으므로 더 이상 나쁘지 않습니다. 가 ()에는, mt_rand보다 훨씬 느린 이후 PHP7 또한, 그러나 그것은 중요하지 않는 한 피해야한다,) 암호화 보안 random_int을 (도입
xZero

34

새로운 PHP7 에서는 마지막으로 암호 학적으로 안전한 의사 난수 정수를 지원합니다.

int random_int ( int $min , int $max )

random_int — 암호 학적으로 안전한 의사 난수 정수를 생성합니다.

기본적으로 이전 답변을 쓸모 없게 만듭니다.


2
훌륭합니다! 그러나 웹 호스트가 PHP7을 더 전 세계적으로 지원할 때까지 불행히도 배포 용 제품을 구축하는 사람에게는 유용하지 않습니다. 따라서 PHP7에서도 작동하는 이전 답변이 여전히 모범 사례입니다.
Matt Cromwell

1
@MattCromwell. 나는 당신에게 동의하지 않습니다. 호스팅 서비스는 PHP7을 지원까지 우리는 대한 polyfill 사용해야 random_intrandom_bytes- 기능 github.com/paragonie/random_compat을 .
Vladimir Posvistelik

궁금한데, 사용하지 않는 이유가 random_int 있습니까? "더 나은"난수를 제공하는 경우 암호가 아닌 이유로 사용하지 않는 이유는 무엇입니까?
Brian Leishman

1
@BrianLeishman 차라리 모든 것에 사용하고 싶습니다. 내가 추측 할 수있는 유일한 단점은 아마도 무작위성의 근원에 의존하고 무작위성을 벗어나면 실패 할 수 있다는 것입니다. 더 비쌀 수도 있지만 (확인해야 함)이 기능이 큰 차이를 만드는 것은
Salvador Dali

더 느리다는 것을 알고 있지만 돌아가서 이미 존재하는 random_ints를 rands로 변경하지 않을만큼 중요하지 않습니다 . 또한, 내 유스 케이스는 재시도 알고리즘은, 나는 확실히 여러 실패한 기능 때문에 예측 가능한 임의의 int의 수면 후 응집하지 않으
브라이언 Leishman

19

빠른 빠른 버전 사용에는, mt_rand 것입니다 :

$min=1;
$max=20;
echo mt_rand($min,$max);

출처 : http://www.php.net/manual/en/function.mt-rand.php .

참고 : 이 작업을 수행하려면 서버에 Math PHP 모듈이 활성화되어 있어야합니다. 그렇지 않은 경우 호스트를 버그로 사용하여 활성화하거나 일반 (그리고 더 느린) rand ()를 사용해야합니다.


6
더 빠르다는 뜻입니까? 차이점은 (입력 == 빠른 vs 빠름 == 성능면에서)
Val

english.stackexchange.com/questions/31732/…- 실제로 둘 다 가능합니다
pee2pee


6

여기에 답변을 묶어 버전을 독립적으로 만들었습니다.

function generateRandom($min = 1, $max = 20) {
    if (function_exists('random_int')):
        return random_int($min, $max); // more secure
    elseif (function_exists('mt_rand')):
        return mt_rand($min, $max); // faster
    endif;
    return rand($min, $max); // old
}


0

이걸로 해봐. 귀하의 희망에 따라 ID를 생성합니다.

function id()
{
 // add limit
$id_length = 20;

// add any character / digit
$alfa = "abcdefghijklmnopqrstuvwxyz1234567890";
$token = "";
for($i = 1; $i < $id_length; $i ++) {

  // generate randomly within given character/digits
  @$token .= $alfa[rand(1, strlen($alfa))];

}    
return $token;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.