我自己的随机数生成器

时间:2014-11-04 18:04:39

标签: c random numbers generator

我想创建一个随机数生成器,用户可以在其中指定生成数字的范围和数量。我希望它能使每个数字都独一无二(不重复)。这就是我到目前为止所做的事情(它产生但有些重复,为什么?)

#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();
}

2 个答案:

答案 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]。

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