【发布时间】:2014-12-31 17:53:29
【问题描述】:
我想制作一个随机数生成器,用户可以在其中指定生成数字的范围和数量。我希望它使每个数字都是唯一的(不重复)。这就是我到目前为止所做的(它生成但其中一些重复,为什么?)
#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();
}
【问题讨论】:
-
使用
std::set,插入到集合中,直到其中有amount数字。另外,使用<random>而不是rand() -
嗯。我认为如果 OP 正在使用 printf/scanf
std::set很可能还没有被覆盖.. -
好的,但是你能告诉我为什么我的代码不起作用吗?理论上它应该这样做。
-
@user3478487 您没有检查第二个分配是否也是重复的。如果您生成一个新号码,您必须在重新分配
number[i]后将j重置为i-1。此外,就目前而言,您总是会重新分配一次,因为当i和j相等时,您正在比较number[i] == number[j],j应初始化为i-1。 -
如果数字大于间隔怎么办(编辑:抱歉,Marc B. 也提到过)?另请注意,当您执行
int number[amount]时,您依赖的是编译器扩展。
标签: c random numbers generator