2014-11-04 84 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],只要它有一个重复。

这是关于你的代码中的错误。另一方面,这个代码的效率非常低,所以如果你计划经常运行这个程序,你应该考虑优化它。