※설명
아래는 C언어로 만든 로또 번호 생성 예제이자 중복 없는 난수 생성 예제다.
본인이 배포하는 로또 프로그램에서 일부 가져와 군더더기를 제거하고 예제에 맞게 수정했다.
중복을 방지하기 위해 생성 여부에 대한 일종의 인덱스를 둬서 따로 검사하지 않아도 중복을 방지할 수 있게 했다.
흔히 사용하는 배열 요소를 처음부터 끝까지 조사 방식은 배열 개수에 따라 속도가 엄청 느려지므로 추천하지 않으며
이렇게 인덱스를 두는 방법은 에라토스테네스의 체를 구할 때도 이용되고
데이터를 캐싱할 때 이미 불러들인 데이터인지 판별할 때도 사용된다.
C++로 구현한 로또 프로그램도 있으니 비교해보니 바란다.
※예제
#include <stdio.h> #include <stdlib.h> //srand #include <time.h> //time //#define _MAX 6 const int nMAX = 6; void BubbleSort( int *nArr, int nArrSize ); int main( ) { //변수 생성 및 초기화 부분 srand( (unsigned)time(NULL) ); //srand로 초기화 int nLottoNum[nMAX] = { 0, }; //생성된 로또 번호를 저장할 변수 bool bCheckExistOfNum[45] = { false, }; //생성된 번호가 중복인지 체크할 변수(인덱스) //번호 생성 부분 for( int i=0 ; i<nMAX ; ) //번호가 6개 생성될 때까지 돈다. { int nTemp = rand()%45; //0~44 범위의 번호를 생성한다. if( bCheckExistOfNum[nTemp] == false ) //중복 여부 판단 { bCheckExistOfNum[nTemp] = true; //번호가 중복 생성되지 않게 존재 여부를 true로 한다. nLottoNum[i] = nTemp+1; //+1을 안해주면 범위가 0~44이다. ++i; //증감 연산을 for문에서 하지 않고 여기서 한다. } } //버블 정렬 BubbleSort( nLottoNum, sizeof(nLottoNum)/sizeof(int) ); //출력 부분 for( int i=0 ; i<nMAX ; ++i ) { printf( "%2d ", nLottoNum[i] ); } return 0; } void BubbleSort( int *nArr, int nArrSize ) { for( int i=0 ; i<nArrSize-1 ; i++ ) { for( int j=0 ; j<nArrSize-(i+1) ; j++ ) { if( nArr[j] > nArr[j+1] ) //꺽쇠 방향으로 오름 차순, 내름 차순 결정 {//값 교환 부분 int temp = nArr[j]; nArr[j] = nArr[j+1]; nArr[j+1] = temp; } } } }
'예제 모음 > C/C++' 카테고리의 다른 글
[C++11] 중복없는 로또 프로그램2 (2) | 2015.11.29 |
---|---|
[C++11] 중복없는 로또 프로그램 (6) | 2015.11.27 |
[C++11] 원 안에만 점 찍기 (0) | 2014.09.02 |
[C언어] 재귀 함수 - 10진수 -> 2진수 변환 (1) | 2014.03.20 |
[C언어] 소수점 특정 자릿수 반올림하기 - ROUND 함수 (0) | 2014.03.14 |
[C언어] 어떤 수 x가 2의 n승인지 판별하는 함수 (0) | 2014.03.13 |
[C언어] 재귀 함수 - 이진 탐색 (Binary Search) (0) | 2013.12.05 |