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]设置为另一个副本 如果你想让你的代码