我想创建一个随机数生成器,用户可以在其中指定生成数字的范围和数量。我希望它能使每个数字都独一无二(不重复)。这就是我到目前为止所做的事情(它产生但有些重复,为什么?)
#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();
}
答案 0 :(得分:3)
您的“检查欺骗”循环不正确。您可能会发现重复,但是您不会检查重新生成的数字是否存在于您已测试的内容中。
e.g。考虑像这样的数组。用户要求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。
答案 1 :(得分:0)
因此,即使我们假设rand()是一个完美的随机数生成器,数字也会重复。 让我们说你必须生成100个数字。假设你的开始= 1并且停止= 100。
您生成的第一个数字从1到100,然后是第二个,依此类推。到目前为止,您使用的数字越多,就越容易复制。
然后你找到了一个内部for循环的副本。您为其生成一个新号码 number [i],但您无法保证此号码的唯一性。你也可以结束 将号码[i]设置为另一个副本。
如果您希望您的代码有效,只要有重复数字,您就必须不断更改数字[i]。
这是关于代码中的错误。 另一方面,这段代码非常低效,所以如果你打算经常运行这个程序,你应该考虑优化它。