[C++] 난수(rand)의 사용


rand()를 하면 임의의 수를 얻어온다.

	std::cout << rand() << std::endl;
	std::cout << rand() << std::endl;
	std::cout << rand() << std::endl;
	std::cout << rand() << std::endl;
	std::cout << rand() << std::endl;

하지만 위 코드를 매번 작동을 시키면 똑같은 값이 나온다. 다른 값이 나오게 하려면 어떻게 해야할까?

srand()


srand(seed)를 사용하여 다른 난수를 얻어올 수 있다.
seed값에 따라 얻어올 수 있는 난수가 다르다.

다르게 말하면, seed 값이 같으면 계속 rand를 돌려도 똑같은 값이 나오는 현상이 발생한다. 위의 코드 처럼.

srand의 seed에 시간을 넣어주면 때에 따라 다른 난수가 출력이 가능하지 않을까?
그래서 시간을 이용해서 난수처리를 많이 한다!

그럼 시간을 어떻게 얻어올 수 있을까?

time(0)


우선, 시간과 관련된 기능을 사용하기 위해서는 관련 헤더 파일을 추가로 include 시켜야한다.

C언어 스타일 : #include <time.h>
C++ 스타일 : #include <ctime>

둘 중 어느 하나를 해도 상관은 없다!

유의사항
srand는 프로그램이 시작할 때 처음 딱 1번만 작동시키면된다!


	std::cout << std::endl;

	std::cout << time(0) << std::endl;
	srand((unsigned int)time(0)); 

	std::cout << rand() << std::endl;
	std::cout << rand() << std::endl;
	std::cout << rand() << std::endl;

time(0)은 1970년 1월 1일 부터 지금까지 몇초가 흘렀는지 체크를 한다.
그래서 매 초마다 다른 값이 srand()안에 들어갈 수 있도록 만들 수 있다.

그리고 실무에서의 주의사항으로 time(0)을 unsigned int로 형변환을 시켜줘야 한다.
빌드 경고를 없애기 위해서이다.

다만 처음으로 얻어오는 난수는 seed에 들어가는 값이 시간이 따라 증가할 경우 매번 조금씩 증가된 값만을 얻어온다.

완전한 난수를 원한다면 첫번째 난수는 얻어오기만 하고 사용을 하지 않고, 두번째 난수부터만 사용을 하면 된다.

난수의 범위 지정


내가 원하는 범위의 난수를 얻도록 가공하고 싶으면 어떻게 하면 될까? 예를 들어 0부터 99까지만 얻고 싶다면..?

나머지 연산자 (%)를 활용하자!
어떤 수가 나오던 간에 100으로 나누면 나올 수 있는 나머지 값은 무조건 0부터 99까지이다! 이를 이용하면 된다!

	std::cout << rand() % 100 << std::endl;
	std::cout << rand() % 100 << std::endl;
	std::cout << rand() % 100 << std::endl;

자, 그럼 최소 ~ 최대 범위의 값을 얻고 싶으면 어떻게 하면 될까?

난수 % (최대 - 최소 + 1) + 최소

따라서, 100부터 200까지 난수를 얻고 싶은 경우

	int min = 100;
	int max = 200;

	std::cout << rand() % (max - min + 1) + min << std::endl;
	std::cout << rand() % (max - min + 1) + min << std::endl;
	std::cout << rand() % (max - min + 1) + min << std::endl;

난수를 이용해서 소숫점 둘째자리 까지의 확률을 구하는 과정을 구현하고 싶다면 어떻게 해야할까?

float Percent = (rand() % (10001)) / 100.f; // 100.00

std::cout << Percent << std::endl;

// 출력 예시 : 49.65

위와 같이 하면 된다.


주의 사항

정수로 나누면 무조건 정수가 나온다!
나눗셈을 하는 둘 중 하나는 무조건 실수로 해주어야 실수 값이 출력된다.


© 2022.07. by Wookey_Kim

Powered by Hydejack v7.5.2