【发布时间】:2014-04-13 23:33:45
【问题描述】:
我正在制作一个随机数生成器。它询问用户希望号码中有多少位数。例如,如果他们输入 2,它将生成 10 到 99 之间的随机数。我已经制作了生成器,但我的问题是这些数字不是唯一的。
这是我的代码。我不确定为什么它没有生成唯一编号。我认为 srand(time(null)) 会这样做。
void TargetGen::randomNumberGen()
{
srand (time(NULL));
if (intLength == 1)
{
for (int i = 0; i< intQuantity; i++)
{
int min = 1;
int max = 9;
int number1 = rand();
if (intQuantity > max)
{
intQuantity = max;
}
cout << number1 % max + min << "\t";
}
}
else if (intLength == 2)
{
for (int i = 0; i<intQuantity; i++)
{
int min = 10;
int max = 90;
int number1 = rand();
if (intQuantity > max)
{
intQuantity = max;
}
cout << number1 % max + min << "\t";
}
}
if (intLength == 3)
{
for (int i = 0; i<intQuantity; i++)
{
int min = 100;
int max = 900;
int number1 = rand();
if (intQuantity > max)
{
intQuantity = max;
}
cout << number1 % max + min << "\t";
}
}
else if (intLength == 4)
{
for (int i = 0; i<intQuantity; i++)
{
int min = 1000;
int max = 9000;
int number1 = rand();
if (intQuantity > max)
{
intQuantity = max;
}
cout << number1 % max + min << "\t";
}
}
if (intLength == 5)
{
for (int i = 0; i<intQuantity; i++)
{
int min = 10000;
int max = 90000;
int number1 = rand();
if (intQuantity > max)
{
intQuantity = max;
}
cout << number1 % max + min << "\t";
}
}
else if (intLength == 6)
{
for (int i = 0; i<intQuantity; i++)
{
int min = 100000;
int max = 900000;
int number1 = rand();
if (intQuantity > max)
{
intQuantity = max;
}
cout << number1 % max + min << "\t";
}
}
if (intLength == 7)
{
for (int i = 0; i<intQuantity; i++)
{
int min = 1000000;
int max = 9000000;
int number1 = rand();
if (intQuantity > max)
{
intQuantity = max;
}
cout << number1 % max + min << "\t";
}
}
else if (intLength == 8)
{
for (int i = 0; i <intQuantity; i++)
{
int min = 10000000;
int max = 89999999;
int number1 = rand();
if (intQuantity > max)
{
intQuantity = max;
}
cout << number1 % max + min << "\t";
}
}
if (intLength == 9)
{
for (int i = 0; i < intQuantity; i++)
{
int min = 100000000;
int max = 900000000;
int number1 = rand();
if (intQuantity > max)
{
intQuantity = max;
}
cout << number1 % max + min << "\t";
}
}
}
好的,所以我想我想出了一种不用数组的方法,但是在我切换到 Fisher yates 方法之前它不起作用。有人可以告诉我为什么这不起作用吗?它应该本质上将随机数放入变量 numGen 中。然后在变量 b = 到 numgen。只是为了保持 numGen 曾经是什么,所以当循环通过并生成另一个随机数时,它将与旧数进行比较,如果不等于它,那么它将输出它。如果它等于旧数字而不是输出它,它将递减 i 以便它在循环中运行而不会完全跳过该数字。然而,当我这样做是无限循环。我不确定为什么。
如果 (intLength == 1) {
for (int i = 0; i< intQuantity; ++i)
{
int min = 1;
int max = 9;
int number1 = rand();
int numGen = number1 % max + min;
if (intQuantity > max)
{
intQuantity = max;
}
for (int k = 0; k < 1; k++)
{
cout << numGen << "\t";
int b = numGen;
}
int b = numGen;
if (b != numGen )
{
cout << numGen << "\t";
}
else
{
i--;
}
}
}
【问题讨论】:
-
你为什么认为这会产生唯一的数字?
-
你想要多少个数字?例如,您不能在 10 到 99 之间获得 200 个唯一数字。
-
我认为 srand(time(NULL)) 不会自然而然地重复它们。我现在在想我必须将它生成的整数输入一个数组然后比较它们。但我不确定我将如何实现它。
-
你可能会更接近
<random>,但不,他们不会每次都产生唯一的数字。 -
我还从用户那里得到他们想要多少数字的输入。但我有一个检查器,可以查看用户输入的数字是否超过最大值,然后它将默认为该范围内的最大数字数量。
标签: c++