C언어에서 랜덤값을 생성하기 위해선 대부분 stdlib.hrand()함수를 사용 할 것입니다. 하지만 rand()함수를 진짜 믿고 써도 되는 걸까요? 랜덤함수보다 더 좋은 성능의 함수를 사용하거나 만들 수는 없을까요?

어느 날 교수님께서 위와 같이 말씀하셨다. 그동안에 단 한번도 이런 궁금증을 가져본 적이 없으므로 필자는 흠칫 놀랄 수 밖에 없었다. 그리곤 진지하게 고민해보는 시간을 가졌다.

rand()의 값을 잘 살펴보면 시간에 의해서 랜덤값이 생성된 다는 것을 알 수 있었다. 시간은 시시각각으로 변하니 그 시간에 특정한 연산을 한다면 랜덤값으로 인식할 수 있게된다. 다만 성능에 대한 고민은 잠시 미뤘다.


처음에는 time_t x = time(NULL)을 이용하여 랜덤값을 생성했다. 하지만 랜덤함수와 유사하게 동작하는 것은 물론이고, 이 방식의 궁극적인 문제점은 동일한 초에 동작한 경우 같은 결과가 나온다는 문제가 있었다. 다른 방법은 고안해야 했다.

두 번째로 생각해 낸 방법은 게임(던전앤 파이터)의 강화 버튼을 떠올렸다. 사용자가 엔터를 입력하는 순간을 감지하여 랜덤값을 생성하고 강화가 성공할지 실패할지 결정하는 것이다. 버튼을 누르는 시간을 0.001초 단위로 분할하면 몇백 명의 사용자가 버튼을 동시에 누르더라도 오차는 있을 수 밖에 없게된다.

하지만 이 소스코드의 문제점은 역시 사용자의 입력이 있어야 한다는 것이다. 컴퓨터가 스스로 랜덤값을 생성할 수 없다는 큰 결함이 있다.



Source Code

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#include <iostream>
#include <conio.h>
#include <time.h>

using namespace std;

time_t x;

void startTime()
{
	x = clock();
}

int customRand(int a, int b)
{
	int temp;
	if (a > b)
	{
		temp = a;
		a = b;
		b = temp;
	}


	// 랜덤범위 설정
	int countNum = 0;
	for (int i = a; i <= b; i++)
	{
		countNum++;
	}
	int setRand = x%countNum;


	// 랜덤값 지정
	int randNum;
	int countNum2 = 0;
	for (int i = a; i <= b; i++)
	{
		countNum2++;
		if (countNum2 == setRand)
		{
			randNum = i;
			break;
		}
		else
		{
			randNum = b;
		}
	}
	return randNum;
}

int main(void)
{
	startTime();
	int num1, num2;
	//cout << x << endl;
	cout << "랜덤값의 범위를 지정해 주세요.( <예시> 15 77 )" << endl;
	while (1)
	{
		if (_kbhit())
		{
			startTime();
			cin >> num1 >> num2;
			int randomValue = customRand(num1, num2);
			cout << randomValue << endl;
			//cout << x << endl;
			break;
		}
	}
}
WRITTEN BY

배진오

소비적인 일보단 생산적인 일을 추구하며, 좋아하는 일을 잘하고 싶어합니다 :D
im@baejino.com