2014-11-04 82 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 2014-11-04 18:05:54

+0

嗯。我想如果OP使用printf/scanf'std :: set'最有可能還沒有被覆蓋.. – drescherjm 2014-11-04 18:07:50

+0

好的,但是你能告訴我爲什麼我的代碼不工作嗎?它應該這樣做。 – user3478487 2014-11-04 18:07:54

回答

3

您的「檢查dupes」循環是不正確的。你可能會發現一個重複的,但是你不檢查這個重新生成的數字是否存在於你已經測試過的東西中。

例如考慮一個像這樣的數組。用戶要求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-3。

+0

這是一個非常不理想的解決方案。它會起作用,但想象一下,如果你想要產生大量的數字並且接近尾聲,會發生什麼。你大部分時間都會生成一個重複,並繼續重複這個循環。 – Tomek 2014-11-04 18:21:00

+1

是的,但OP沒有要求有效的解決方案。 – 2014-11-04 18:22:13

+0

我只是想讓他知道這一點。這可能是一個問題,尤其是現實生活中的隨機數發生器不是非常統一。它會在開始時耗盡所有頻繁的值,然後可能最終會試圖找到剩餘的數字 – Tomek 2014-11-04 18:23:13

0

所以,即使我們假設蘭特()是一個完美的隨機數發生器,數字會重複。 假設您必須生成100個號碼。說你開始= 1和停止= 100

您生成從1到100的第一數目,然後是第二等..到目前爲止,你已經使用了更多的數字,越容易得到重複。

然後您發現與該內部for-loop重複。您爲 number [i]生成一個新號碼,但是您不能保證這個號碼是唯一的。您最好將 設置編號[i]結尾到另一個副本。

如果你希望你的代碼工作,你要不斷變動數[I],只要它有一個重複。

這是關於你的代碼中的錯誤。另一方面,這個代碼的效率非常低,所以如果你計劃經常運行這個程序,你應該考慮優化它。