[자료구조] w2_난수 발생 함수

dusruddl2·2023년 8월 15일
0

자료구조

목록 보기
9/23

난수 (random number)

주사위 눈 수처럼 특정한 나열순서나 규칙없이 생성된 무작위 수

rand() 함수

rand()
: 0~RAND_MAX 범위의 무작위 정수 반환
(RAND_MAX는 rand()가 반환할 수 있는 최대수, 시스템마다 다를 수 있음)

  • 난수 발생함수를 사용하기 위해서는 아래와 같은 헤더파일이 필요하다.
    여기에 rand()를 발생시킬 수 있는 최대수인 RAND_MAX 정의되어 있다.
#include<stdlib.h>

TIP

rand() % n
: 0 ~ (n-1) 범위의 난수 생성
ex1) 0~1사이의 정수 난수 발생 -> rand() % 2
ex2) 0~10000사이의 정수 난수 발생 -> rand() % 10001

rand() % n + m
: m ~ (n - 1 + m) 범위의 난수 발생
ex1) 1~6사이의 정수 난수 발생 -> rand() % 6 + 1
ex2) 1000~9999사이의 정수 난수 발생 -> rand() % 9000 + 1000

((((long) rand() << 15) | rand()) % 1000000) + 1
: 1 ~ 1,000,000 범위의 난수 생성
: RAND_MAX = 32,767인 경우 이 수보다 큰 범위의 난수를 발생시키기 위한 방법
: 32,767의 16진수 표현은 0X7FFF, 2진수 표현은 0111 1111 1111 1111이므로
rand() 호출은 15비트로 표현할 수 있는 난수를 반환한다.
이 값을 왼쪽으로 15비트만큼 shift해준 뒤 두번째 rand() 호출로부터 얻은 난수와 OR연산을 해주면 30비트로 표현할 수 있는 난수를 얻을 수 있다.
이 난수의 범위는 0 ~ 1,073,741,823이며 이 값을 1,000,000으로 나머지 연산을 한 뒤 1을 더해주면 1 ~ 1,000,000 범위의 난수를 얻게 된다

srand() 함수

#include<stdlib.h>
int main(void) {
	printf(“%d\n”, rand());
	return 0;
}

위와 같은 코드를 실행해보면 계속 같은 난수만 생성되는 것을 볼 수 있다.

이를 해결하기 위해, 즉 매번 다른 난수를 발생시키기 위해 시드(seed)값을 설정해야 한다. 시드 값을 달리하면 매번 다른 난수를 생성할 수 있기 때문

srand()
: 시드 값을 설정하기 위해 사용하는 함수
: 전달하는 인자를 기반으로 난수를 초기화시키느 ㄴ역할

srand()의 인자로 time()

srand()의 인자로 함수 time() 권장한다
time() 함수가 반환한 현재의 초 수를 인자로 하여 srand()를 호출하면 난수 기준
값이 (무작위라 할 수 있는) 현재 초 수로 초기화되기 때문이다.

따라서 아래와 같이 호출하면 된다

srand(time(NULL))

또한, 잊지 말아야 할 것은 time()함수를 이용하기 위해서는 헤더파일이 필요하다

#include<time.h>

그럼 이제 아래의 예시를 살펴보자

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
	int main(void) {
	srand(time(NULL));
	printf(“%d\n”, rand());
	return 0;
}

profile
정리된 글은 https://dusruddl2.tistory.com/로 이동

0개의 댓글