c-我自己的随机数生成器



我想制作一个随机数生成器,用户可以在其中指定生成的数字的范围和数量。我希望它使每个数字都是唯一的(不再重复)。这就是我到目前为止所做的(它会生成,但其中一些会重复,为什么?)

#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],只要它有重复的。

这是关于代码中的错误。另一方面,此代码效率极低,因此如果计划经常运行此过程,则应考虑对其进行优化。

最新更新