2014-11-04 7 views
0

생성 된 숫자의 범위와 양을 지정하는 난수 생성기를 만들고 싶습니다. 모든 번호를 고유하게 만들려고합니다 (반복 없음). 이것은 내가 지금까지 해왔 던 것입니다 (생성하지만 일부는 반복됩니다, 이유는 무엇입니까?)내 자신의 난수 생성기

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

int main() 
{ 
    srand(time(NULL)); 

    int start, stop, amount; 

    system("chcp 1250 >nul"); 

    printf("Welcome to random number generator!\n"); 
    printf("\nWhat range? \nFrom: "); scanf("%i", &start); 
    printf("To: "); scanf("%i", &stop); 

    printf("\nHow many numbers?: "); scanf("%i", &amount); 
    int number[amount]; 

    for(int i=0; i<amount; i++) 
    { 
     number[i] = rand() % ((stop+1)-start) + start; 

      for(int j=i; j>-1; j--) 
      { 
       if(number[i]==number[j]) 
       { 
        number[i] = rand() % ((stop+1)-start) + start; 
       } 
      } 

     printf("\n%i generated number: %i", i+1, number[i]); 
     Sleep(10); 
    } 

    getch(); 
} 
+1

'std :: set'을 사용하여'amount '숫자가있을 때까지 세트에 삽입하십시오. 또한'rand() '대신''을 사용하십시오 – Borgleader

+0

흠. 나는 OP가 printf/scanf'std :: set'을 사용하고있을 가능성이 가장 높습니다. – drescherjm

+0

그래,하지만 내 코드가 왜 작동하지 않는지 말해 줄 수 있니? Teoritycally 그것은 그것을해야합니다. – user3478487

답변

3

"중복 검색"루프가 잘못되었습니다. 복제본을 찾을 수는 있지만 이미 재 작성된 번호가 이미 테스트 한 내용에 존재하는지 확인하지 않습니다.

이와 같은 배열을 생각해보십시오. 사용자가 5 개의 숫자, 범위 1-10을 요구했습니다.

number[0] = 5 
number[1] = 6 
number[2] = 2 
number[3] = 8 

이제 숫자 [4]를 작업하고 있습니다. 2을 생성합니다 ... 배열을 거꾸로 스캔하면 2이 속는 사람임을 알 수 있습니다. 그래서 새로운 번호를 생성하고 8을 생성합니다. 그러나 당신은 당신의 j 루프를 리셋하지 않습니다 - 당신은 계속해서 뒤로 작업을하고, 8이 어레이에 이미 있음을 결코 볼 수 없습니다.

 for(int j=i; j>-1; j--) { 
      if(number[i]==number[j]) { 
       number[i] = rand() % ((stop+1)-start) + start; 
       j = i; // RESET THE LOOP 
      } 
     } 

그리고 당신의 코드를 쉽게 무한 루프를 생성 할 수 있습니다 :

은 당신이해야하는 것은 더 같은 것입니다. 예 : 1-3의 범위에있는 숫자를 요구하는 사람을 생각해보고 그 중 4 개를 생성하십시오. 1,2,3,?. 적어도 한 번의 반복없이 1-3을 가질 수 없으므로 조건을 충족시킬 수 없습니다.

+0

이것은 매우 차선책입니다. 작동하지만, 많은 숫자를 생성하려고하고 끝까지 가까워지면 어떻게 될지 상상해보십시오. 대부분의 시간에 속임수를 생성하고 반복을 반복합니다. – Tomek

+1

예,하지만 OP는 효율적인 솔루션을 요구하지 않습니다. –

+0

나는 그에게이 사실을 알고 싶습니다. 이는 실제로는 균일하지 않은 실제 난수 생성기의 경우 특히 문제가 될 수 있습니다. 그것은 처음부터 모든 빈번한 값들을 다 쓸 것이고 나머지 숫자를 찾으려고 계속 붙어있을 것입니다. – Tomek

0

따라서 rand()가 완벽한 난수 생성기라고 가정해도 숫자가 반복됩니다. 100 개의 숫자를 생성해야한다고 가정 해 보겠습니다. 시작 = 1, 정지 = 100이라고 말하십시오.

1부터 100까지의 첫 번째 숫자를 생성 한 다음 두 번째 숫자 등등을 생성합니다. 지금까지 사용했던 숫자가 많을수록 복사하기가 쉽습니다. .

그런 다음 해당 내부 for 루프를 사용하여 복제본을 찾습니다. number [i]의 새 번호를 생성하지만이 번호가 고유하다는 보장은 없습니다. 너는 설정 번호 [i]를 다른 사본으로 끝낼 수도 있습니다.

코드를 작동 시키려면 복제본이있는 한 번호 [i]를 계속 변경해야합니다.

코드의 버그와 관련이 있습니다. 반면에이 코드는 매우 비효율적이므로이 절차를 자주 실행하려는 경우 최적화를 고려해야합니다.