Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 我自己的随机数发生器_C_Random_Numbers_Generator - Fatal编程技术网

C 我自己的随机数发生器

C 我自己的随机数发生器,c,random,numbers,generator,C,Random,Numbers,Generator,我想制作一个随机数生成器,用户在其中指定生成的数字的范围和数量。我希望它使每个数字都是唯一的(不重复)。这就是我到目前为止所做的(它产生了一些问题,但其中一些问题会重复,为什么?) #包括 #包括 #包括 #包括 int main() { srand(时间(空)); int开始、停止、数量; 系统(“chcp 1250>nul”); printf(“欢迎使用随机数生成器!\n”); printf(“\n什么范围?\n从:”);scanf(“%i”,&start); printf(“To:”;sc

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

#包括
#包括
#包括
#包括
int main()
{
srand(时间(空));
int开始、停止、数量;
系统(“chcp 1250>nul”);
printf(“欢迎使用随机数生成器!\n”);
printf(“\n什么范围?\n从:”);scanf(“%i”,&start);
printf(“To:”;scanf(“%i”、&stop);
printf(“\n有多少个数字?:”);scanf(“%i”,&amount);
整数[金额];
对于(int i=0;i-1;j--)
{
如果(编号[i]==编号[j])
{
编号[i]=rand()%((停止+1)-开始)+开始;
}
}
printf(“\n%i生成的编号:%i”,i+1,编号[i]);
睡眠(10);
}
getch();
}
您的“检查重复”循环不正确。您可能会找到一个重复的,但是您不会检查重新生成的数字是否存在于您已经测试过的内容中

例如,考虑这样的数组。用户要求提供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次。

您的“检查重复”循环不正确。您可能会找到一个重复的,但是您不会检查重新生成的数字是否存在于您已经测试过的内容中

例如,考虑这样的数组。用户要求提供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次。

您的“检查重复”循环不正确。您可能会找到一个重复的,但是您不会检查重新生成的数字是否存在于您已经测试过的内容中

例如,考虑这样的数组。用户要求提供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次。

您的“检查重复”循环不正确。您可能会找到一个重复的,但是您不会检查重新生成的数字是否存在于您已经测试过的内容中

例如,考虑这样的数组。用户要求提供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个。因此,即使我们假设rand()是一个完美的随机数生成器,这些数字也会重复。 假设您必须生成100个数字。说你的开始=1,停止=100

生成第一个从1到100的数字,然后生成第二个,依此类推。。到目前为止,您使用的数字越多,就越容易获得副本

然后找到一个具有该内部for循环的副本。您将为其生成一个新编号 编号[i],但您不能保证此编号是唯一的。你也可以结束 将编号[i]设置为另一个副本

如果您想让代码正常工作,您必须不断更改编号[i],只要它有一个副本

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

所以,即使我们假设RAND()是一个完美的随机数生成器,数字也会重复。 假设您必须生成100个数字。说你的开始=1,停止=100

生成第一个从1到100的数字,然后生成第二个,依此类推。。到目前为止,您使用的数字越多,就越容易获得副本

然后找到一个具有该内部for循环的副本。您将为其生成一个新编号 编号[i],但您不能保证此编号是唯一的。你也可以结束 将编号[i]设置为另一个副本

如果你想让你的代码