웹마스터 팁
page_full_width" class="col-xs-12" |cond="$__Context->page_full_width">
좋은 난수값을 얻기위한 시드배정 방법 mt_srand(), srand()
2002.02.21 04:35
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 값이 나오는(위 주석처리안된) 사용중인데
아무리 난수발생알고리듬이 뛰어나도 필연적으로 중복값은 발생하죠.
그 중복값 발생의 빈도를 줄이고자 시드배정 방법을 달리하는 것인데
(요 부분 제가 와서 찜찜해 수정 ^^ 아공 배고파랑..)
이 부분에 있어 난수의 한계성을 느끼고 궁극적으로 전체 배열값에서
결코 중복되지않도록 하는 다른 알고리듬 구현을 모색하다가
그냥 최대효과, 최소소요시간에 만족하기로 한 상태입니다.
/*
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 값이 나오는(위 주석처리안된) 사용중인데
아무리 난수발생알고리듬이 뛰어나도 필연적으로 중복값은 발생하죠.
그 중복값 발생의 빈도를 줄이고자 시드배정 방법을 달리하는 것인데
(요 부분 제가 와서 찜찜해 수정 ^^ 아공 배고파랑..)
이 부분에 있어 난수의 한계성을 느끼고 궁극적으로 전체 배열값에서
결코 중복되지않도록 하는 다른 알고리듬 구현을 모색하다가
그냥 최대효과, 최소소요시간에 만족하기로 한 상태입니다.
댓글 0
제목 | 글쓴이 | 날짜 |
---|---|---|
쉘 명령어 사용하기 [11] | 9000㎒ | 2003.12.02 |
세션을 이용한 관리자 모드 구축하기 1강(중복?) | 박정호 | 2003.12.09 |
세션을 이용한 관리자 모드 구축하기 2강 [6] | 박정호 | 2003.12.09 |
세션을 이용한 관리자 모드 구축하기 3강 [6] | 박정호 | 2003.12.09 |
DB에서 받은 데이터 배열로 하나씩 뿌리기 | LetMeLove | 2003.12.09 |
편법을 이용한 inlive 방송여부 체크 [7] | 심심타 | 2003.12.09 |
카일레라 서버 페이지 만들기. [2] | teslaMINT | 2003.12.09 |
[제로카운터] 자동으로 DB를 지우자. (IP와 referer 5일 분량만 남기기) [4] | 이주경 | 2003.12.17 |
나도 @ 도메인 서비스를 해보자 [29] | 김병철 | 2003.12.19 |
[MySQL] Set 형 자료형.. [3] | 서영태 | 2003.12.24 |
일정시간 이 지난 게시물 정리하기.. [3] | 명동욱 | 2003.12.24 |
GET으로 받는 변수가 하나일 때, 주소?변수값 사용하기 [5] | 버찌 | 2004.01.05 |
[팁&테크] 텍스트파일에서 디비 입력하기. [1] | 김영진 | 2004.01.09 |
include에서 Failed opening 발생문제 [4] | 이경훈 | 2004.01.10 |
unset / isset 를 알아보자. [2] | 씨파개 | 2004.01.12 |
제로보드 인크루드시 $DOCUMENT_ROOT 참조 [7] | 이경훈 | 2004.01.14 |
제로카운터 쉽게 설치하기
[26]
![]() | 대류 | 2004.01.17 |
(중복) 개인서버 운영하시는분들.. 좋은소스? [14] | SeePaGae | 2004.01.22 |
아이피를 숨겨보자 [5] | SeePaGae | 2004.01.23 |
[초허접기초!!] PHP 가 무엇인고..?? 1탄.. [6] | SeePaGae | 2004.01.24 |