php에서는 다양한 난수를 만들어 낼 수 있습니다. 물론 다양하다는 말 즉은 개발자들 약간의 수고로움이 있어야 가능한 일입니다.

초기에 난수 생성기를 사용할때, 보통 srand()로 난수를 초기화하고, rand()로 정수 난수를 생성하였지만, 기존의 방식은 많이 느리다는 단점에  mt_rand()로 대체하길 권고하는데, 이는 확실히 특성을 가진 난수 생성기를 이용합니다. 이것은 평균적인 libc 제공의 난수 생성기에 비해 4배 정도 빠르게 동작합니다.

또한 PHP 4.2.0부터 srand()나 mt_srand()를 이용하여 난수 생성 초기화 필요없이 바로 randmt_rand 로 난수를 만들어 낼 수 있고, PHP 5.2.1 이후 부터 동일한 값을 생성하지 않는다고 메뉴얼에 나와 있습니다. 그래도 안정성을 위해 mt_srand 로 초기화하길 권합니다.


int
mt_rand ( int $min , int $max ) (PHP 4, PHP 5)

mt_rand 난수 생성기는 사용법이 rand 함수와 동일하며, 선택적인 min , max 인수 없이 호출하면, mt_rand()는 0과 mt_getrandmax() 사이의 모조 난수를 반환합니다. 예를 들어, 5와 15(포함)사이의 난수를 원할 경우에는, mt_rand(5, 15)로 사용합니다.

mt_getrandmax() 함수는 mt_rand()를 호출했을 때 반환될 수 있는 가장 큰 값, 2147483647 값을 가지기 때문에 mt_rand(0, mt_getrandmax()); 로 범위 지정이 가능합니다.

예제 (ex #1

  <?php
 
// seed with microseconds
 
function make_seed
(){
      list(
$usec$sec) = explode(' 'microtime
());
      return (float) 
$sec + ((float) $usec 100000
);
 } 

 
mt_srand(make_seed
());
 
$randval mt_rand(0,mt_getrandmax
()); 


 echo 
$randval
// 결과: 2003708190 




 
$randval mt_rand
(); 


 echo 
$randval
// 결과: 1765245802
 
?>

예제 (ex #2

 <?php
 
echo mt_rand() . "\n"
;
 echo 
mt_rand() . "\n"
;


 echo 
mt_rand(515
);
 
?> 


다음은 난수 발생기는 아니지만, 배열에서 하나 이상의 임의 원소를 가져 옵니다. 첫 번째 인자는 입력할 배열이고, 두 번째 인자는 가져올 배열의 갯수를 지정합니다.

예제 (ex #3
 <?php
 mt_srand
((float) microtime() * 10000000
);
 
$input = array("Neo""Morpheus""Trinity""Cypher""Tank"
); 

 
$rand_keys array_rand($input2
); 


 echo 
$input[$rand_keys[0]] . "\n"


 echo 
$input[$rand_keys[1]] . "\n"


 
// 결과: Neo Cypher
 
?>

다음과 같은 난수 발생기는 완벽하게 자동등록봇으로부터의 차단은 불가하지만 숫자로만 이루어진 기존 방식 보다는 보안성이 조금 개선된다 생각하시면 됩니다.

 <?php 
 
function makeRand($len=6
) {
    if(!
is_int($len) || ($len 6
)) {
        
$len 6
;
    }
    
$arr array_merge(range('A''Z'), range('z''a'), range(19
));


    
$rand false

    for(
$i=0$i<$len$i
++) { 
       
$rand .= $arr[mt_rand(0,count($arr)-1
)]; 
    } 
    return 
$rand
;
 } 
 
$rand makeRand
();
 echo 
$rand
// 결과: nkma3N


 // <input type='text' name='rand' value='aDxc6n'>
 // 난수 nkma3N, 사용자 aDxc6n 
 
if($rand !== $_POST['rand'
]){
    exit(
'입력하신 난수와 생성한 난수가 틀립니다. 정상적인 방법으로 접근해 주세요.'
);
 }
 
?>


관련글: 2011/06/13 - [phP 함수 레퍼런스/배열 함수] - 난수 생성기 #2

블로그 이미지

하보니

하보니와 함께하는 phP 초보

댓글을 달아 주세요