我想制作一个随机数生成器,用户可以在其中指定生成的数字的范围和数量。我希望它使每个数字都是唯一的(不再重复)。这就是我到目前为止所做的(它会生成,但其中一些会重复,为什么?)
#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();
}
您的"检查重复"循环不正确。你可能会发现一个重复的数字,但你不会检查你已经测试过的东西中是否存在重新生成的数字。
例如,考虑这样的数组。用户要求5个数字,范围1-10
number[0] = 5
number[1] = 6
number[2] = 2
number[3] = 8
现在您正在处理数字[4]。您生成2
。。。您向后扫描阵列,发现2
是一个重复。所以你生成了一个新的数字。。。并生成CCD_ 3。但您不会重置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场比赛中至少重复一次。
因此,即使我们假设rand()是一个完美的随机数生成器,数字也会重复。假设你必须生成100个数字。假设你的起点=1,终点=100。
你生成了从1到100的第一个数字,然后是第二个,依此类推。到目前为止,你使用的数字越多,就越容易得到重复的数字。
然后,您会找到一个具有内部for循环的副本。您为生成一个新号码数字[i],但你不能保证这个数字是唯一的。你还不如结束将数字[i]设置为另一个重复。
如果你想让你的代码工作,你必须不断地更改数字[i],只要它有重复的。
这是关于代码中的错误。另一方面,此代码效率极低,因此如果计划经常运行此过程,则应考虑对其进行优化。