Computer - Random Number

[TOC]

랜덤 숫자

공통 변수

정수(int) 랜덤값

void int_random() {
	srand(time(NULL));

	int min = 1;
	int max = 5;
	int range = max - min + 1;

	for (size_t i = 0; i < 10; i++)
	{
		int raw_random = rand();
		int random = min + (raw_random % range);
		cout << raw_random << "\t" << random << endl;
	}
}

부동소수점(float) 랜덤값 - 기본

void float_random() {
	srand(time(NULL));

	float min = 7.0;
	float max = 8.0;
	float range = max - min;

	for (size_t i = 0; i < 10; i++)
	{
		int raw_random = rand(); // max 포함
		//int raw_random = rand() % (RAND_MAX - 1); // max 미포함
		float random = min + (((float)raw_random / RAND_MAX) * range);
		cout << raw_random << "\t" << random << endl;
	}
}

부동소수점(float) 랜덤값 - 범위 묶기

void float_random_bunch() {
	srand(time(NULL));

	float min = 7.0;
	float max = 8.0;
	float range = max - min;
	int range_bunch_count = 3;

	for (size_t i = 0; i < 100; i++)
	{
		int raw_random = rand() % range_bunch_count;
		//float random = min + (((float)raw_random / (range_bunch)) * range); // max 포함
		float random = min + (((float)raw_random / (range_bunch_count - 1)) * range); // max 미포함
		cout << raw_random << "\t" << random << endl;
	}
}

선형합동법(Linear Congruential)

난수를 발생하는 알고리즘으로 부하가 적지만 품질이 낮다.

최대 M가지의 경우가 있고 난수의 주기도 최대 M이다.

짝수, 홀수가 반복된다.

하위 비트 쪽 정밀도가 떨어지고 최하위에 가까울 수록 정밀도는 현저히 떨어진다.

결과를 오른쪽으로 몇 비트시프트 시켜서 회피할 수 있고 좁아진 난수 범위는 M을 크게 해서 만회한다.

\[\begin{gather*} \begin{array}{ c c c } X_{0} & : & 시드값\\ X_{n} & : & n번째\ 의사\ 난수\\ A,\ B & : & 서로소인\ 두\ 수\\ M & : & 정밀도 \end{array}\\ \\ X_{n+1} \ =\ ( A\times X_{n} +B) \%M \end{gather*}\]

A, B, M 숫자 정하기

선형합동법 구현

void linear_congruential() {
	int m = 16;
	int a = 5;
	int b = 3;
	
	for (size_t i = 0; i < 20; i++)
	{
		int r = (a * i + b) % m;
		cout << r << endl;
	}
}