C언어 Rand함수 직접 만들기

C언어 Rand함수 직접 만들기

Author : Jino Bae / Send Mail

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


어느 날 교수님이 위처럼 말씀해 주셨습니다. 그동안 아무 생각 없이 rand() 함수를 사용해 왔었기에 저는 흠칫 놀랄 수밖에 없었습니다. 그리곤 진지하게 고민을 해보는 시간을 가지게 되었습니다.


처음에는 time_t x = time(NULL)을 이용하여 랜덤값을 생성했습니다. 하지만 랜덤함수와 유사하게 동작하는 것은 물론이고, 이 방식의 궁극적인 문제점은 동일한 초, 즉 1초 내에 프로그램을 2번 실행하면 같은 결과가 나온다는 것입니다. 그래서 저는 다른 방법을 고안해야 했습니다.


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


하지만 이 소스코드의 문제점은 역시 사용자의 입력이 있어야 한다는 것 입니다. 사용자의 입력없이 랜덤값을 호출하면 결과는 0이 출력됩니다.




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;
		}
	}
}

Jino Bae
WRITTEN BY

Jino Bae

Digital is a purely man-made playground. That's why I like.
im@baejino.com


comments powered by Disqus