관리 메뉴

드럼치는 프로그래머

[C/C++] 랜덤함수의 표현범위 늘리는 방법 ( rand(), srand(), RAND_MAX ) 본문

★─Programing/☆─C | C++

[C/C++] 랜덤함수의 표현범위 늘리는 방법 ( rand(), srand(), RAND_MAX )

드럼치는한동이 2009. 2. 3. 10:49

음... 난 랜덤 함수가 좋다 아무도 종잡을수 없는 행동을 할 수있게 해주는 랜덤 함수 쿠쿠쿠

음... 가격이 비싸지 않을까 걱정이 되긴 하지만 뭐! 상관 없다. 그래도 좋다

 

rand 는 거의 srand 함수와 함께라고 생각 하면 좋을 것 같다. 쿠쿠쿠

 

프로그램 실해시 이렇게 한번 srand를 실행 시킨뒤

 

srand((unsigned)time(NULL));

 

언제 어디서든 rand 함수를 사용 하면된다.

 

음... 참고로

 

rand() % 10 이렇게 하면

0부터 9까지의 숫자만을 표현 하게 되며

 

rand() % 10 + 11 이렇게 하면

 

11 부터 20까지의 숫자를 얻을수가 있게 된다. 좋다! ㅋㅋㅋ

 

이아래는 참고 지식인에서 긁어 왔다  랜덤함수가 표현 할수 있는 수는 32767인데 그걸 늘리는

 

방법 이라고 한다.

 

출처는 지식인의 angebi0 님이십니당!

 

32767을 16진수로 바꾸면 0x7FFF입니다.

그러니까 rand함수가 15비트이하의 불특정한 값을 리턴하는 거죠.

5000000은 16진수로  0x4C4B40입니다. 20비트 미만이죠.

그러므로 rand함수를 두번만 쓰면 20비트를 커버하죠.

그래서,,,

long a;

srand((unsigned)time(NULL));

a=( ( (long) rand()<<15) | rand() ) %5000000;

라 해주면 됩니다.

 

 

좀더 설명을 드린다면,,,

rand가 만약 0~9까지 리턴하는 함수이고 우리는 0~99까지 의 범위의 램덤값을 가지고 싶은 경우를 생각해 봅시다. 십의 자리 숫자를 rand로써 한번 얻어 내고 일의 자리 숫자를 rand로써 한번 더 얻어내면 됩니다. rand_val= rand()*10+rand(); 정도가 되겠지요. 999의 범위를 원하면 세번쓰면 되고요.

99/rand식의 방법은 좋지 않습니다. (물론 나누기 0문제를 제외하더라도) rand라는게 골고루 어떤 값이라도 얻을 수 있어야 하는데 그렇지 못합니다. rand를 한번만 써서는 어떤 정해진 계산을 한다하더라도 진정한 난수값을 얻을 수 없습니다.

 

 

그리고 int의 범위는 시스템마다 다르며 RAND_MAX값과 상관이 없고,

RAND_MAX가 32767이 아닌 컴파일러가 있습니다


Comments