본문 바로가기
STUDY

재미로 해보는 로또 당첨 시뮬레이터

by PsychoFLOOD 2021. 6. 22.
728x90

30대 후반까지는 로또니 주식이니 이런 것들에 관심도 없었었는데 최근 일확천금을 꿈꾸며(??) 가끔 한장씩 사곤 한다.
1등 당첨확률이 정확히 8,145,060분의 1인데 이와 유사하게 피씨로 돌려도 나올까? 가 궁금하게 되었다.

일단 실제 로또 당첨 데이터를 최근것까지 텍스트 파일로 만들었다.(글 맨밑에 첨부하였음)
데이터를 배열로 읽어와서 이제 주구장창 6개씩 랜덤하게 숫자를 만들어서 모든 당첨횟수 데이터와 비교해 보면 되겠다.

일단 모든 데이터(968회)에 대하여서 돌려보니 아래와 같다.

확실히 비교할 데이터가 많으니..(968개) 금방금방?? 당첨이 된다.
매번 데이터를 찍으면 디스플레이 속도가 너무 느리므로.. 10만회마다 몇초 걸렸는지 나오게 했으며..
당첨될때마다 몇회차의 번호와 같은지 그리고 얼마나 투자했는지 출력하게 하였다.
내 피씨의 속도로는 대략 2.9초마다 10만번씩 랜덤로또값을 생성하고 968회의 데이터와 비교하는 데 사용되었다.

대략 10회 1등 당첨되는 동안 1번 1등 될때마다 평균 30만회의 게임과... 평균 3억의 돈을 썼다 ㅋㅋ..
물론 이건 968회분의 데이터 가지고 한 것이기 때문에 실제로는 훠얼씬... 돈이 많이 드는 셈이다.(마지막 summary에도 보면... 평균게임 횟수에다 968을 곱해보면 2억9천만회가 필요하다고 나온다....ㅠㅠ;;; )

특정 회차의 데이터만을 가지고 돌려보니... 몇천만번의 게임을 해도 당첨이 되지 않는다... 시간도 오래 걸리고...
실제 확률인 대략 800만분의 1보다도 훨씬 어렵다는 걸 체감하게 되는 순간이었다. 헐...

비교 데이터를 최근10회만가지고 돌려본 결과.. 무려 3천3백만번 중에 한번 당첨되었다..헐...들어간 돈은 330억 ㅋㅋㅋ


역시 번개를 맞을 확률보다도 훨씬 낮다는 로또 1등 확률이 정말 어려운 거구나를 체감하는 순간이다.
그냥 당첨을 바라기보다는... 혹시나? 하는 생각으로 일주일을 기대감에 열심히 일하게 해주는 보조제(?)로만 활용해야겠구나를 느끼는 순간이었다..ㅠㅠ

아래는 사용한 코드 및 데이터파일.

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <conio.h>
#include <windows.h>

#pragma warning(disable: 4996)
#define _CRT_SECURE_NO_WARNINGS

//qsort 오름차순 정렬용 비교함수 
int compare(const void* a, const void* b)
{ return *(int*)a - *(int*)b; }

int main(int argc, char* argv[]) {
int lotto[6] = { 0, }, index=1, i, r, j, k;
int lottolist[1000][7], total_list, win_count =0;
unsigned int try_count = 0;
__int64 total_cost = 0, total_try_count=0; clock_t start;
FILE* fp=0;
srand((unsigned int)time(0));
i = 0; 
//986회차 데이터가 담긴 텍스트로부터 데이터 읽어오기 
fp = fopen("lottolist.txt", "rt"); 
if (fp) {
while (!feof(fp)) {
fscanf(fp, "%d %d %d %d %d %d %d", &lottolist[i][0], &lottolist[i][1], &lottolist[i][2], &lottolist[i][3], &lottolist[i][4], &lottolist[i][5], &lottolist[i][6]); 
i++; 
} 
fclose(fp); 
} 
total_list = i - 1;
printf("Lotto data 로딩완료 총 %d 회\n", total_list);
//시간계산용 시작클럭 저장 
start = clock();

while(1) {
try_count++;
lotto[0] = rand() % 45 + 1;
index = 1;
//1회분 로또 랜덤데이터 생성 
while (1) {
r = rand() % 45 + 1;
for (i = 0; i < index; i++){
if (lotto[i] == r)
break;
} 
if (i == index){
lotto[index] = r;
index++;
} 
if (index == 6) 
break; 
}
//오름차순 정렬 퀵소트 
qsort(lotto, 6, sizeof(int), compare);
//위에서 저장한 로또 986회차 데이터와 비교수행 
for (i = 0; i < total_list; i++) {
// for (i = 0; i < 10; i++) {
for (j = 1; j <= 6; j++)
if (lottolist[i][j] != lotto[j - 1]) break;
//j값이 7이라는건 모두 같다는 뜻! 
if (j == 7) { 
printf("Try Count : %d ", try_count);
for (k = 0; k < 6; k++) printf("%2d ", lotto[k]);
for (k = 0; k < 6; k++) printf("%2d ", lottolist[i][k+1]);
printf(" %d회차 당첨 / 투자금:%.0f 만원 / 1등 당첨횟수 : %d회\n", lottolist[i][0], (float)try_count*0.1, ++win_count); 
total_cost += try_count * 0.1;
total_try_count += try_count;
try_count = 0;
//바로 다음걸 생성하면 같은 번호 생성되는 일이 있어서 약간 딜레이줌 
Sleep(50);
break;
}
}
if (try_count % 100000 == 0 && try_count > 0) { 
printf("게임수 : %d회 ", try_count);
for (i = 0; i < 6; i++) 
printf("%2d ", lotto[i]);
printf(" %.2fsec..", (float)(clock() - start)/CLOCKS_PER_SEC); printf("\n"); 
}
//무한루프 도는중 키입력 있으면 현상태 요약보고 
if (kbhit()) { 
getch(); 
if(win_count) printf("\n총 투자금액 : %lld 만원 / 1등 당첨 평균 투자금액 : %lld 만원 / 평균 당첨 게임수 : %lld / 평균게임 X %d회 = %lld회 \n", total_cost, total_cost/win_count, total_try_count / win_count, total_list, (total_try_count / win_count)*total_list); 
}
//로또배열 초기화
memset(lotto, 0, 6);
//time에 clock까지 더해서 넣으면 좀 더 랜덤값이 더 랜덤하게 나오는 듯? 
srand(clock() + time(0) );
}
return 0;
}

 

lottolist.txt
0.03MB

 

728x90

'STUDY' 카테고리의 다른 글

폰FOTA Update이후 Tethering 안됨현상.  (0) 2021.08.02
Excel VBA macro 에서 cmd 실행  (0) 2021.07.22
brake 관련 읽어보면 좋은 글들  (0) 2021.06.15
CSTS FL 응시 및 통과.  (4) 2021.04.07
P0420 DTC 발생 및 관련 Study  (0) 2021.02.15

댓글