C++ 기초 정리 (rand, srand)
카테고리: Cpp
rand(), srand()
rand() : 난수를 만들어준다.
- rand해서 나오는 숫자의 범위는 short 타입의 범위와 같다.
- rand만 호출할 경우 고정된 seed 값을 사용하기 때문에 rand를 계속 호출해도 같은 난수 값이 나온다.
srand(time(0));
- srand를 호출하여 rand 함수에 사용될 seed 를 초기화 해준다. 이 초기화는 매개변수로 받는 seed 값을 이용해서 한다.
- seed 값으로 time(0)을 넣어주는데, 이 뜻은 … -> 정리 필요
- 단, 이 경우 time(0) 값의 첫번째 값도 고정이라 rand()를 여러번 호출할 경우 첫번째 값은 여전히 같은 값으로 나온다.
- 그래서 rand()를 한번 사용하여 같은 값을 털어낸다.
1 2
srand(time(0)); rand();
- 아니면 그냥 time(NULL)을 사용하는 것도 방법이다.
1
srand(time(NULL));
범위 내의 난수 구하기기
1
2
3
4
5
6
7
8
9
10
11
// 0 ~ 100 사이의 소수점 둘째자리까지의 확률을 구하는 법
// 구간값: 100 - 0 = 100
// 난수 % (구간값 + 1) + 최소값
// 소수점 둘째자리 까지니까, 10000 까지 구해서 /100.f 하거나, * 0.01f 하는 것.
float percent = rand() % 10001 / 100.f;
// 0 ~ 100 사이의 소수점 넷째자리까지의 확률을 구하는 법
// 정수부분, 소수점부분 따로 구해야 함
int intValue = rand() % 101;
float floatValue = rand() % 10001 / 10000.f;
float result = intValue + floatValue;
빙고 만들기
system(“pause”), system(“cls”)
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#include <iostream>
#include "time.h"
void main()
{
int input = 0;
int array[25] = {};
bool isOpen[25] = { false };
bool completeRow[5] = { false }; // 가로 줄 완성 여부
bool completeCol[5] = { false }; // 세로 줄 완성 여부
bool completeDiagonal[2] = { false }; // 대각선 완성 여부 (왼->오, 오->왼)
int lineCount = 0;
srand(time(NULL));
// 배열 초기화
for (int i = 0; i < 25; ++i)
array[i] = i + 1;
// 배열 섞기
for (int i = 0; i < 25; ++i)
{
int index = rand() % 25;
std::swap(array[i], array[index]);
}
while (true)
{
// 콘솔 화면의 텍스트를 모두 지운다.
system("cls");
// 화면 출력
for (int i = 0; i < 25; ++i)
{
if (isOpen[i])
std::cout << "*\t";
else
std::cout << array[i] << "\t";
if (i % 5 == 4)
std::cout << "\n";
}
// 매턴 새로 검사
int newLines = 0;
// 가로 체크
for (int row = 0; row < 5; ++row)
{
if (!completeRow[row])
{
bool allOpen = true;
for (int col = 0; col < 5; ++col)
{
if (!isOpen[row * 5 + col])
{
allOpen = false;
break;
}
}
if (allOpen)
{
completeRow[row] = true;
newLines++;
}
}
}
// 세로 체크
for (int col = 0; col < 5; ++col)
{
if (!completeCol[col])
{
bool allOpen = true;
for (int row = 0; row < 5; ++row)
{
if (!isOpen[row * 5 + col])
{
allOpen = false;
break;
}
}
if (allOpen)
{
completeCol[col] = true;
newLines++;
}
}
}
// 대각선 체크 (왼->오)
if (!completeDiagonal[0])
{
bool allOpen = true;
for (int i = 0; i < 5; ++i)
{
if (!isOpen[i * 6])
{
allOpen = false;
break;
}
}
if (allOpen)
{
completeDiagonal[0] = true;
newLines++;
}
}
// 대각선 체크 (오->왼)
if (!completeDiagonal[1])
{
bool allOpen = true;
for (int i = 1; i <= 5; ++i)
{
if (!isOpen[i * 4])
{
allOpen = false;
break;
}
}
if (allOpen)
{
completeDiagonal[1] = true;
newLines++;
}
}
lineCount += newLines;
if (newLines > 0)
std::cout << "맞춘 줄 갯수: " << lineCount << std::endl;
if (lineCount >= 5)
break;
// 입력
std::cout << "입력할 숫자 (0 입력시 종료): ";
std::cin >> input;
if (input == 0)
break;
if (input < 1 || input > 25)
{
std::cout << "잘못된 숫자를 입력했습니다. (1 ~ 25 사이 값 입력)";
// 콘솔 화면을 일시정지 시켜준다.
system("pause");
continue;
}
for (int i = 0; i < 25; ++i)
{
if (array[i] == input)
{
isOpen[i] = true;
break;
}
}
}
}
댓글남기기