본문 바로가기
C,C++/코드정리

[C/C++] 로또 구현 (셔플 알고리즘)

by 마두식 2022. 9. 7.
반응형
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
#include <iostream>
#include <time.h>
 
int main() {
    int lotto[45];
    srand((unsigned int)time(NULL));
 
    for (int i = 0; i < 45++i) {
        lotto[i] = i + 1;
    }
 
    int idx1, idx2, tmp;
 
    for (int i = 0; i < 100++i) {
        idx1 = rand() % 45;
        idx2 = rand() % 45;
 
        tmp = lotto[idx1];
        lotto[idx1] = lotto[idx2];
        lotto[idx2] = tmp;
 
        // 이렇게 할 경우 idx1 인덱스의 값은 이미 lotto[idx2] 값이 들어가있으므로
        // lotto[tmp] 또한 마찬가지로 lotto[idx2] 값과 같을 수밖에 없다.
        /*tmp = idx1;
        lotto[idx1] = lotto[idx2];
        lotto[idx2] = lotto[tmp];*/
    }
 
    for (int i = 0; i < 45++i) {
        std::cout << lotto[i] << "\t";
    }
 
    std::cout << std::endl << std::endl;
 
    for (int i = 0; i < 6++i) {
        std::cout << lotto[i] << "\t";
    }
 
    std::cout << "보너스 번호 : " << lotto[6<< std::endl;
 
    return 0;
 
}
cs

 

1 ~ 45 사이의 값 중 중복 없이 임의의 번호 6개와 보너스 번호 1개 총 7개를 추출하는 코드입니다.

 

 

로또 번호 45개를 저장할 배열 lotto[45]를 선언하고 값을 할당합니다.

임의의 숫자 추출을 위해 rand() 함수를 이용할 것이므로 seed값이 계속해서 변동되도록 srand 함수를 6 번째 라인과 같이 호출해줍니다.

 

 

셔플 알고리즘입니다.

특정 배열의 값을 섞어주는 방법으로, 여기서는 lotto[45] 의 배열에 저장된 값들을 서로 섞어주고 있습니다.

아마도 임의 추출의 경우 그냥 rand() % 45 를 6번 동작시키면 된다고 생각하시는 분들이 계실 것 같습니다.

하지만 이럴 경우 중복 값도 포함돼서 출력되기 때문에 위와 같은 방법을 활용합니다. 라인 별로 코드를 분석해 보겠습니다.

 

먼저 12 번째 라인에서 각 배열의 인덱스 역할을 할 idx1, idx2를 선언하여 줍니다.

14 ~ 16 번째 라인에서 반복문을 100번 돌리며 idx1, idx2에 각각 0~44 사이의 임의의 값을 할당합니다. 위에서 말했던 것 처럼 rand() % 45의 값이 중복될 수 있으므로 반복문을 100번 돌려 중복의 확률을 최대한 줄여주는 것입니다.

 

18 ~ 20 번째 라인은 swap 동작입니다. 쉽게 말해 lotto[idx1]의 값과 lotto[idx2]의 값을 바꿔주는 과정입니다. 어렵지 않은 코드이니 알아볼 수 있을 것이라 생각합니다.

 

22 ~ 26 번째 라인은 실수할 수 있는 부분을 주석으로 작성해 둔 것입니다. 코드에 대한 주의사항은 주석으로 작성해두었기 때문에 생략하겠습니다.

 

셔플 알고리즘의 경우 하스스톤 등과 같은 카드 게임에서 사용될 수 있는 알고리즘입니다. 알아두면 좋을 것 같습니다.

 

 

29 ~ 31 번째 라인은 lotto[45] 배열의 원소들이 제대로 섞였는지 확인하는 코드입니다.

35 ~ 39 번째 라인은 6개의 번호와 1개의 보너스 번호를 출력하는 코드입니다.

 

 

잘못된 부분이나 개선 사항은 언제나 편하게 댓글로 지적해주세요.

감사합니다.

 

 

출처

(7) C언어/C++ 강의 13화 로또 [어소트락 게임아카데미] - YouTube

반응형

'C,C++ > 코드정리' 카테고리의 다른 글

[C/C++] 빙고 게임 구현  (0) 2022.09.07
[C/C++] 숫자 퍼즐 게임 구현  (0) 2022.09.07
[C/C++] 야구게임 구현  (0) 2022.09.07
[C/C++] 별찍기 구현  (0) 2022.09.07
[C/C++] 가위바위보 게임 구현  (0) 2022.09.07

댓글