'rand'에 해당되는 글 1건

  1. 2013.02.15 난수 (Random Number)

난수 (Random Number)

Programming/C 2013. 2. 15. 03:50 |

rand

#include <stdlib.h>

int rand(void)

의사 난수(Pseudo-Random Number) 반환.


호출될 때마다 난수가 반환되는 이 함수 역시 수학 관련 함수이다. 다만 함수가 정수와 관련 있기 때문에 stdlib.h에 선언되어 있는 상태이다.




이 소스코드는 몇 번을 실행해도 달라지지 않는다. rand함수가 난수를 발생시키지만, 생성되는 패턴이 항상 동일하기 때문에 수학에서 말하는 진정한 난수는 아니다. 그래서 rand함수가 반환하는 수를 가리켜 "의사난수"라 한다.


※ rand 함수가 동일한 패턴의 난수를 발생시키는 이유는 난수를 생성하는 기초 정보인 씨드(seed) 값이 항상 동일하기 때문이다. 





srand

#include <stdlib.h>

void srand(unsigned seed)

반환하지 않는다.


위 함수를 호출하면서 정수를 전달하면, 전달된 정수로 씨드 값이 변경된다 따라서 이 함수를 통해서 씨드 값을 변경시키면 rand 함수의 난수 생성 패턴은 달라진다.







■ [난수의 범위 제한] 


난수의 범위 20~70사이의 값

- 조 건 -

§ rand 함수가 최소값을 반환하면 이 값은 20 정도가 되어야 한다.

§ rand 함수가 최대값을 반환하면 이 값은 70 정도가 되어야 한다.

§ rand 함수가 중간 크기의 값을 반환하면, 이 값은 20과 70의 중간 크기인 45 정도의 값이 되어야 한다.


이는 rand 함수가 반환하는 값의 크기 분포 비율을 거의 그대로 유지하기 위함이다.




rand 함수의 반환 값을 RAND_MAX로 나누되 double형 나눗셈을 진행하고 있다. 따라서 나눗셈의 결과는 0 이상 1 이하의 실수가 된다.

이어서 변수 diff에 저장된 값 50을 곱하니, 연산의 결과는 최대 0 이상 50 이하의 실수가 된다. 

이 결과에다 RAND_MIN을 더하니 20이상 70이하의 값이 된다.

참고로 다음과 같이 문장을 구성해도 20이상 70이하의 값을 얻을 수는 있다. 문제는 rand 함수가 반환하는 값의 크기 분포를 유지하지 못한다는데 있다. 따라서 문제의 조건을 만족시키려면 22행과 같이 문장을 구성해야 한다.


rand2070 = (rand() % diff+1) + RND_MIN;


이 문장과 위의 코드 22행의 문장은 지정한 범위 내의 난수 생성에 사용되는 대표적인 문장들이다.




■ [난수의 범위 제한] 


난수의 범위가 10이상 100이하 중에서 3의 배수가 되게 하라.

단 값의 크기 분포 비율이 rand 함수가 반환하는 값의 크기 분포 비율과 유사해야 한다.




22행 23행은 반환 값을 rnd3div 보다 작은 3의 배수로 변화하는 방법이다. 22행의 정수형 나눗셈에 의해서 소수점 이하의 부분은 잘려나간다. 그리고 이렇게 소수점 이하가 잘려나간 정수에 3을 곱하기 때문에 RND_MAX를 넘지 않는 3의 배수가 된다.


'Programming > C' 카테고리의 다른 글

Bit Mask  (0) 2013.02.15
시간과 날짜 관련 함수들  (0) 2013.02.15
r+, w+ a+ 모드의 활용  (0) 2013.02.15
표준 입력 및 출력 그리고 에러의 리다이렉션  (0) 2013.02.15
fsetpos, fgetpos 함수  (0) 2013.02.15
Posted by scii
: