rand() 함수에 의한 중복값 처리 어떻게 해줘야 될까요?
글쓴이: khaic0c0 / 작성시간: 월, 2003/05/26 - 10:22오전
#include <stdio.h>
int main(void)
{
int test,result;
srand( (unsigned)time( NULL ) ); //rand()함수에 초기값을 첨부터 주기위한 srand 함수 사용.
for( test=1; test<=6; test++ )
{
result = rand()%45 + 1;
printf( "LOTTO %d jari ==> %d \n",test,result );
}
return 0;
}
이런 소스가 있다고 할때 1부터 45까지는 랜덤하게 숫자를 잘 뿌려주지만,
중복값이 나올때가 있습니다.
전..중복값은 필요없거든요. 예를들어 32,32 이렇게 중복으로 나올때가 있는데.
중복값이 있나 없나 체크하고 중복값이 없을 경우에만 printf( "LOTTO %d jari ==> %d \n",test,result );
이부분이 실행되었으면 하는데 뭘 어떻게 해줘야 할지 모르겠더군요..
간단하게 어떤 소스를 첨가하면 될까요?
아니면 힌트라도.. 어떤 개념을 알고있어야 중복값을 피할수 있을지요.. :- )
답변 부탁드립니다.
Forums:


배열을 45개짜리로 잡고각각을 숫자에 대한 플래그로 잡으면 안될까요?
배열을 45개짜리로 잡고
각각을 숫자에 대한 플래그로 잡으면 안될까요?
어떤숫자가 나오면 배열에다가 체크를 하고..
다음에 다시뽑을때 그값이 뽑혔는지 체크만하면 되겠네요
뽑혔으면 다시뽑고..아님 또 배열에 체크해놓고
더 효율적인 방법이 많을것 같은데..
제 생각엔 이게 젤 간단한듯합니다..
발상의 전환
1~45까지 배열에 넣어 두고
랜드 함수를 이용해서 섞으면 더 효율적이지 않을까요?
그럼 중복 체크 안해도 되고요..;;
울랄라~ 호기심 천국~!!
http://www.ezdoum.com
위의 답변하신 분들 내용과 비슷한 알고리즘 하나 소개할게요.물론 해당
위의 답변하신 분들 내용과 비슷한 알고리즘 하나 소개할게요.
물론 해당 숫자를 만들어 놓고 섞는 것입니다.
(카드 섞기;;)
1. 일단 배열을 만듭니다. 원하는 수치만큼 배열을 잡고 여기다 차례대로 숫자를 쓰면 되겠죠.
2. 난수 2개를 만듭니다. 이 난수는 배열 인덱스 내의 숫자로 뽑아야 합니다.
3. 2에서 뽑은 난수에 해당하는 인덱스 끼리 swap합니다.
4. 특정 횟수까지 2번부터 반복
얼마나 반복하느냐에 따라 그 섞이는 정도가 높아지겠죠. 물론 완벽하게 섞인다는 보장은 없으나 간단하고 빠르지요. :)
--
http://renn.sapzilla.org/
제가 짰던..
로또 번호 생성기...^^;; 저도 해본게 있는데,
참고하시라고 전체 소스를 올려드립니다...
숫자 n 을 입력 받아서, 로또 6개 숫자의 합이 n 이 되게, 중복없이
5개의 조합된 숫자를 뿌리는 프로그램 일겁니다..(하도 오래돼서..-_-)
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> int lotto_gen(int); int main() { char hap[4]; int integer_hap = 0; int i; srand(time(NULL)); printf("합이 몇이 되게 모실까요? >> "); fgets( hap, 4, stdin); integer_hap = atoi(hap); for (i = 0 ; i < 5 ; i++ ) { lotto_gen(integer_hap); putchar('\n'); } } int is_in( int *tem, int item) { int i; for ( i = 0 ; i < 6 ; i++ ) { if ( tem[i] == item ) { return 1; } } return 0; } int flush_lotto(int *tem) { int i; for ( i = 0 ; i < 6 ; i++ ){ tem[i] = 0; } return 1; } int lotto_gen(int integer_hap){ int lotto_hap = 0; int lotto_gap = 0; int lotto_hap_temp = 0; int templary_saved[6]= {0}; int i = 0; #ifdef DEBUG int j; #endif while(1){ lotto_hap_temp = lotto_hap; lotto_gap = (rand() % 45) + 1; #ifdef DEBUG printf("%d ",lotto_gap); for ( j = 0 ; j < 6 ; j++) printf("%d, ", templary_saved[j]); putchar('\n'); getchar(); #endif if ((lotto_hap_temp += lotto_gap) < integer_hap) { if ( !is_in(templary_saved,lotto_gap) ) { templary_saved[i++] = lotto_gap; lotto_hap = lotto_hap_temp; if ( i > 5 ) { flush_lotto(templary_saved); i = 0; lotto_hap = 0; continue; } } } else if ( lotto_hap_temp == integer_hap ) { if ( !is_in(templary_saved,lotto_gap) ) { templary_saved[i++] = lotto_gap; if ( i != 6 ) { flush_lotto(templary_saved); i = 0; lotto_hap = 0; continue; } break; } } else if( lotto_hap_temp > integer_hap){ flush_lotto(templary_saved); i=0; lotto_hap = 0; } } for( i = 0 ; i < 6 ; i++ ) { printf("%d ", templary_saved[i]); } }----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라
random_sample_n 알고리듬을 쓰세요.
gcc나 Borland C++Builder 6/Kylix 3에서 기본 지원하는
SGI STL에 있는 random_sample_n 알고리듬을 사용하면 한큐에 됩니다.
//--------------------------------------------------------------------------- #include <iostream> #include <cstdlib> #ifndef __BORLANDC__ #include <ctime> #endif #pragma hdrstop #include <iterator> #include <algorithm> #include <numeric> //--------------------------------------------------------------------------- using namespace std; int main() { const int N = 45, R = 6; int Balls[N]; iota(&Balls[0], &Balls[N], 1); // 1, 2, 3, ... 45 를 배열에 넣습니다. #ifdef __BORLANDC__ randomize(); #else srand(time()); #endif // random_sample과 달리 원본 순서를 유지합니다. 그러므로 오름차순으로 출력됩니다. random_sample_n(&Balls[0], &Balls[N], ostream_iterator<int>(cout, " "), R); cout << endl; return 0; } //---------------------------------------------------------------------------다른 컴파일러 사용자는 STLport를 받아다가 설치하면 SGI STL을 쓸 수 있습니다.
예전에 만들어둔 것이 있어서..
허접 소스라 부끄럽내요... ^^
#include <stdlib.h> #include <stdio.h> #include <time.h> #define SWAP(x, y, t) ((t)=(x), (x)=(y), (y)=(t)) #define STACK_SIZE 20 int stack[STACK_SIZE]; int top = -1; int push(int ); int pop(); void sort_nm(int right); int k[6]; main() { int i; int j; int n=0; /* */ int m; int o; int p=0; printf("content-type: text/html%c%c",10,10); puts("<html><head><title>최첨단 로또 예측 시스템</title></head><body>"); puts("<center><br><br><br>-------------<a href=\"http://www.qprk.pe.kr/cgi-bin/lotto.cgi\">한번더</a>--------------"); puts("<br><br><table border=0>"); //_new: puts(""); for(o=0; o<5;o++){ if((o%2)==0) printf("<tr bgcolor=\"#edf1f3\"><td>%d&|&</td>",o+1); else printf("<tr bgcolor=\"#ffffff\"><td>%d&|&</td>",o+1); n++; if(n >= 100000) n=0; for(i=0;i<6;i++) k[i] = 0; srandom((time(NULL)+n)); for(i=0;i<6;i++){ // 저장소 초기화 _cont: m = random()%45 +1; p++; if(p > 100000){ puts("<br><br><br>time out try again..<br>"); puts("-------------<a href=\"http://www.qprk.pe.kr/cgi-bin/lotto.cgi\">한번더</a>--------------"); exit(0); } for(j=0;j<=i;j++){ if(k[j] == m) goto _cont; } k[i] = m; }// for sort_nm(5); for(i=0;i<6;i++){ printf("<td> %02d &</td>",k[i]); } puts("</tr>"); } puts("</table>"); puts("<br>-------------<a href=\"http://www.qprk.pe.kr/cgi-bin/lotto.cgi\">한번더</a>--------------"); puts("</body></html>"); //getchar(); //goto _new; } void sort_nm(int right) { int pivot; int left=0; int i,j; int key; int debug; debug = right+1; push(left); push(right); /* */ while(top >= 0){ right = pop(); left = pop(); if( right-left > 0 ){ i = left; /* 왼쪽 시작 위치 -1 */ j = right+1; /* 오른쪽 시작위치 +1 */ key = k[left]; /* 비교 기준값 */ do{ do{ i++; }while(k[i]< key && i < debug); do{ j--; }while(k[j] > key && j >= 0); if(i<j){ SWAP(k[i], k[j], pivot); } }while(i<j); SWAP(k[left], k[j], pivot); push(left); /* 좌측 분할구간 왼쪽 위치 */ push(j-1); /* 좌측 분할구간 오른쪽 위치 */ push(j+1); /* 우측 분할구간 왼쪽 위치 */ push(right); /* 우측 분할구간 오른쪽 위치 */ } } } int push(int data) { if( ++top > STACK_SIZE){ printf("\n Stack Overflow !\n"); exit(-1); } stack[top] = data; return 1; } int pop() { if( top < 0){ printf("\n Stack Underflow !\n"); exit(-1); } return stack[top--]; }멋진남자...
음..예전에 숫자 야구 게임 할때 만들었던 함수네요..^^;;(허접..-
음..예전에 숫자 야구 게임 할때 만들었던 함수네요..^^;;(허접..--;; )
int * MAKE_RAND(int many) { int *rand_num, i, j, tmp, flag; rand_num = (int*)malloc(sizeof(int) * many); for(i=0, srand(time(0)) ; i<many ; ) { flag = GO; tmp = rand()%many + 1; // 제일 처음 생성된 난수. 무조건 대입 if(i==0) rand_num[i++] = tmp; // 그 다음부터 생성되는 난수. 이전 난수와 중복 검사 else { for(j=0 ; j<i ; j++) if(tmp==rand_num[j]) // 중복되면.... { flag=STOP; break; } if(flag==GO) // 중복되지 않으면 대입 rand_num[i++] = tmp; } } return (rand_num); // 포인터 리턴 }===================================================
중요한건 얼마나 아느냐가 아니라 그것에 대한 열정이다.
I have another one...
#include <stdio.h> #include <stdlib.h> #include <time.h> #define LTT_MIN 1 #define LTT_MAX 45 #define GAME_MAX 5 #define NUM_MAX 6 int get_num(void) { return (LTT_MIN + (int) ((double)LTT_MAX * rand () / (RAND_MAX + 1.0))); } int main (void) { int i = 0, j = 0, k = 0; int ltt[GAME_MAX][NUM_MAX] = { {0} }; srand ((unsigned int) time (NULL)); do { do { GET_NUMBER: ltt[j][i] = get_num(); for (k = 0; k < i; k++) if (ltt[j][i] == ltt[j][k]) { printf("same number! %d\n", ltt[j][k]); goto GET_NUMBER; } // printf ("ltt[%d][%d] is %d\n", j, i, ltt[j][i]); i++; } while (i < NUM_MAX); printf("GAME %2d : ", j+1); for (i=0; i<NUM_MAX; i++) printf("%2d ", ltt[j][i]); printf ("\n"); i=0; j++; } while (j < GAME_MAX); return 0; }Good Luck !
댓글 달기