웹마스터 팁

list($usec,$sec) = explode(" ",microtime());

/*
Test: Each get rand sequence are 10time.
ex) 5.3point meaning 5point integer + 3point decimal
*/

/*
PHP Manual 4 본문에 제시된 예문
5.0point - 1time
6.0point - 9time
*/
// $rand = (double)microtime()*1000000;

/*
PHP Manual 4 유저가 포스팅한 예문
decimal 값이 나오는 문제점이 있다.
8.6point - 1time
9.4point - 1time
9.5point - 7time
10.3point - 1time
*/
// $rand = (double)$sec * $usec;

/*
2002-02-17 07:13:45 양창민에 의하여 생성된 알고리듬 - 방법 1
분포는 전항 결과값이 평균적으로 8~10자리인데 최소 자릿수인 8자리에 고정
8.0point - 10time
*/
$rand = explode(".",$usec * $sec); $rand = (double)substr($rand[0]*$rand[1],0,8);

/*
2002-02-18 08:08:05 양창민에 의하여 생성된 알고리듬 - 방법 2
평균분포 9자리를 유지하는 plus연산
9.0point - 9time
10.0point - 1time
*/
// $rand = explode(".",$usec * $sec); $rand = $rand[0] + $rand[1];


mt_srand($rand);
srand($rand);

// ycm_debug( (double)microtime()*1000000  , (double)$sec * $usec ,   $rand );


P.S in 2002-02-21 03:29:17
위 마지막 ycm_debug() 는  위의 각 시드 배정방법들의 작용결과를
테스트하기 위하여 10단계 히스토리 3원소 나열하는 form 구조체로서
해당 시드별 생성 난수 분포를 파악하기 위하여 만든 함수로,
위의 함수를 바탕으로 무수한 난수결과값을 얻는 과정을 거쳐
해당 시드별 난수 분포 유형을 명확히 파악한 뒤
다른 분들 참고하길 바라는 마음에 적은 것인데...
개선요지는
- 가능한 integer값의 분포가 0~9까지 골고루 될 것.
- 자릿수 변화가 적을 것.
- 연산시간상 불리함을 최소화할 것.
참고로 저는 홈퓌 방문자에게 메인 대문역할 게시판에 38원소 배열,
BGM 플레이어에서 곡 인덱싱에 사용되는 30~100원소 배열,
게시판 메뉴 칼러 패턴을 얻는데 사용되는 컬러코드값 3원소 배열,
상단 타이틀 배경색에 사용되는 컬러코드값 3원소 배열들에
대하여 난수를 사용하는데 정밀 난수가 필요치않아
그냥 5-7포인트정도 integer 값이 나오는(위 주석처리안된) 사용중인데
아무리 난수발생알고리듬이 뛰어나도 필연적으로 중복값은 발생하죠.
그 중복값 발생의 빈도를 줄이고자 시드배정 방법을 달리하는 것인데
(요 부분 제가 와서 찜찜해 수정 ^^ 아공 배고파랑..)
이 부분에 있어 난수의 한계성을 느끼고 궁극적으로 전체 배열값에서
결코 중복되지않도록 하는 다른 알고리듬 구현을 모색하다가
그냥 최대효과, 최소소요시간에 만족하기로 한 상태입니다.