该程序的目标是将6个随机数添加到1到50之间的数组中,并且不能重复。我通常在检查时遇到问题,以确保没有重复。
我已经尝试了多种方法,但似乎无法弄清楚。 (在此之前,还有更多与我的问题无关的代码。)
.....
//puts random numbers into an array
i = 0, j = 0;
for (i = 0; i < arrSize; i++)
{
randArr[i] = randNums(1,50);
}
//checks to make sure there are no duplicates
i = 0, j = 0, k = 0, temp = 0;
for (i = 0; i < arrSize; i++)
{
for (j = 1; j <= arrSize;)
{
if (randArr[j] == randArr[i])
{
for (k = j; k <= arrSize; k++)
{
temp = randNums(1,50);
temp = randArr[k];
randArr[k] = randArr[k + 1];
randArr[k + 1] = temp;
}
arrSize--;
}
else
j++;
}
}
.....
//generates random numbers between the inputed max and min
int randNums(int min, int max)
{
int result = 0, low = 0, high = 0;
if (min < max)
{
low = min;
high = max + 1;
}
else
{
low = max + 1;
high = min;
}
srand(time(NULL));
result = (rand() % (high - low)) + low;
return (result);
}
答案 0 :(得分:2)
几个观察结果:
您需要调用srand()(正在执行)
您应该只调用srand()一次(您多次调用它)
rand()返回的值可以重复。您需要考虑这一点。
请记住,C库使用“伪随机”算法-它不是真正的“随机”。
也请看这里:
生成的数字并不是真正随机的;通常,它们形成一个 周期性重复的序列,周期很大 出于普通目的可以忽略它。随机数生成器有效 通过记住用于计算下一个随机数的种子值 并计算新种子。
...
您可以在特定机器上获得可重复的数字序列 通过为随机数指定相同的初始种子值来键入 发电机。特定的种子值没有标准含义; 相同的种子,用于不同的C库或不同的CPU 类型,将为您提供不同的随机数。
答案 1 :(得分:0)
每次调用randNums
都会以当前系统时间作为参数调用srand
。
rand
函数在以下几行中执行某些操作(伪代码):
rand()
{
seed = (some permutation on seed);
return seed%RAND_MAX;
}
srand
将seed
访问的rand
的状态更改为您作为参数传递的状态。如果您对randNums
的调用是在同一秒内发生的,它们都会将种子更改为相同的值,因此rand
在两种情况下都具有相同的seed
并产生相同的结果。 / p>