rand() 함수에 의한 중복값 처리 어떻게 해줘야 될까요?

khaic0c0의 이미지

#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 );

이부분이 실행되었으면 하는데 뭘 어떻게 해줘야 할지 모르겠더군요..
간단하게 어떤 소스를 첨가하면 될까요?

아니면 힌트라도.. 어떤 개념을 알고있어야 중복값을 피할수 있을지요.. :- )
답변 부탁드립니다.

맹고이의 이미지

배열을 45개짜리로 잡고
각각을 숫자에 대한 플래그로 잡으면 안될까요?
어떤숫자가 나오면 배열에다가 체크를 하고..
다음에 다시뽑을때 그값이 뽑혔는지 체크만하면 되겠네요
뽑혔으면 다시뽑고..아님 또 배열에 체크해놓고
더 효율적인 방법이 많을것 같은데..
제 생각엔 이게 젤 간단한듯합니다..

choissi의 이미지

1~45까지 배열에 넣어 두고
랜드 함수를 이용해서 섞으면 더 효율적이지 않을까요?
그럼 중복 체크 안해도 되고요..;;

울랄라~ 호기심 천국~!!
http://www.ezdoum.com

Renn의 이미지

위의 답변하신 분들 내용과 비슷한 알고리즘 하나 소개할게요.
물론 해당 숫자를 만들어 놓고 섞는 것입니다.
(카드 섞기;;)

1. 일단 배열을 만듭니다. 원하는 수치만큼 배열을 잡고 여기다 차례대로 숫자를 쓰면 되겠죠.

2. 난수 2개를 만듭니다. 이 난수는 배열 인덱스 내의 숫자로 뽑아야 합니다.

3. 2에서 뽑은 난수에 해당하는 인덱스 끼리 swap합니다.

4. 특정 횟수까지 2번부터 반복

얼마나 반복하느냐에 따라 그 섞이는 정도가 높아지겠죠. 물론 완벽하게 섞인다는 보장은 없으나 간단하고 빠르지요. :)

나빌레라의 이미지

로또 번호 생성기...^^;; 저도 해본게 있는데,

참고하시라고 전체 소스를 올려드립니다...

숫자 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]); 
        } 
} 

----------------------
얇은 사 하이얀 고깔은 고이 접어서 나빌레라

cedar의 이미지

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을 쓸 수 있습니다.

qprk의 이미지

허접 소스라 부끄럽내요... ^^

#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--];
}

멋진남자...

wind772의 이미지

음..예전에 숫자 야구 게임 할때 만들었던 함수네요..^^;;(허접..--;; )

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); // 포인터 리턴
}

===================================================
중요한건 얼마나 아느냐가 아니라 그것에 대한 열정이다.

mach337의 이미지

#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 !

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.