我想做一个随机数生成器,用户指定生成的数的范围和数量。我希望它能让每个数字都是唯一的(没有重复)。这就是我到目前为止所做的(它会生成,但其中一些会重复,为什么?)
#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();
}发布于 2014-11-05 02:13:26
你的“检查重复”循环是不正确的。你可能会发现一个重复的数字,但是你不会检查这个重新生成的数字是否存在于你已经测试过的东西中。
例如,考虑这样的数组。用户要求输入5个号码,范围为1-10
number[0] = 5
number[1] = 6
number[2] = 2
number[3] = 8现在,您正在使用number4。你生成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个。
发布于 2014-11-05 02:15:52
因此,即使我们假设rand()是一个完美的随机数生成器,这些数字也会重复。假设你必须生成100个数字。假设你的start =1,stop = 100。
生成第一个从1到100的数字,然后生成第二个数字,依此类推。到目前为止,你使用的数字越多,就越容易得到重复的数字。
然后,您会找到一个具有该内部for循环的副本。您为numberi生成了一个新的数字,但不能保证这个数字是唯一的。您可能最终会将numberi设置为另一个重复项。
如果你想让你的代码正常工作,你必须不断地修改数字,只要它有重复的数字。
这是关于你代码中的bug的。另一方面,此代码的效率非常低,因此如果您计划经常运行此过程,则应考虑对其进行优化。
https://stackoverflow.com/questions/26741961
复制相似问题