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개의 조합된 숫자를 뿌리는 프로그램 일겁니다..(하도 오래돼서..-_-)
----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라
random_sample_n 알고리듬을 쓰세요.
gcc나 Borland C++Builder 6/Kylix 3에서 기본 지원하는
SGI STL에 있는 random_sample_n 알고리듬을 사용하면 한큐에 됩니다.
다른 컴파일러 사용자는 STLport를 받아다가 설치하면 SGI STL을 쓸 수 있습니다.
예전에 만들어둔 것이 있어서..
허접 소스라 부끄럽내요... ^^
멋진남자...
음..예전에 숫자 야구 게임 할때 만들었던 함수네요..^^;;(허접..-
음..예전에 숫자 야구 게임 할때 만들었던 함수네요..^^;;(허접..--;; )
===================================================
중요한건 얼마나 아느냐가 아니라 그것에 대한 열정이다.
I have another one...
Good Luck !
댓글 달기