为什么随机数生成器不断重复相同的数字?

时间:2019-01-20 23:02:58

标签: c random numbers

该程序的目标是将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);
}

2 个答案:

答案 0 :(得分:2)

几个观察结果:

  1. 您需要调用srand()(正在执行)

  2. 您应该只调用srand()一次(您多次调用它)

  3. rand()返回的值可以重复。您需要考虑这一点。

  4. 请记住,C库使用“伪随机”算法-它不是真正的“随机”。

也请看这里:

  

https://www.gnu.org/software/libc/manual/html_node/Pseudo_002dRandom-Numbers.html#Pseudo_002dRandom-Numbers

     

生成的数字并不是真正随机的;通常,它们形成一个   周期性重复的序列,周期很大   出于普通目的可以忽略它。随机数生成器有效   通过记住用于计算下一个随机数的种子值   并计算新种子。

     

...

     

您可以在特定机器上获得可重复的数字序列   通过为随机数指定相同的初始种子值来键入   发电机。特定的种子值没有标准含义;   相同的种子,用于不同的C库或不同的CPU   类型,将为您提供不同的随机数。

答案 1 :(得分:0)

每次调用randNums都会以当前系统时间作为参数调用srand

rand函数在以下几行中执行某些操作(伪代码):

rand()
{
     seed = (some permutation on seed);
     return seed%RAND_MAX;
}

srandseed访问的rand的状态更改为您作为参数传递的状态。如果您对randNums的调用是在同一秒内发生的,它们都会将种子更改为相同的值,因此rand在两种情况下都具有相同的seed并产生相同的结果。 / p>