【问题标题】:Why does the random number generator keeps repeating the same number? [duplicate]为什么随机数生成器总是重复相同的数字? [复制]
【发布时间】:2019-06-14 08:39:22
【问题描述】:

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

【问题讨论】:

  • srand(time(NULL)); 应该在开始时只调用一次以初始化 RNG。
  • @Osiris 我不明白你的意思。我在代码中只有一次。
  • 但是每次使用randNums 生成随机数时,您都会调用srand。您应该从randNums 中删除srand 并将其放入main
  • @Osiris 我把 srand 放在了主目录中。我把它放在正确的位置了吗?
  • 请不要纠正帖子中的错误,只在你自己的代码中。人们不会明白你在问什么。回滚。现在可以看到,您每次调用rand() 之前都调用了srand()

标签: c random numbers


【解决方案1】:

每次调用randNums 都会调用srand,并将当前系统时间作为参数。

rand 函数执行以下操作(伪代码):

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

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

【讨论】:

    【解决方案2】:

    几个观察:

    1. 您需要调用 srand()(您正在这样做)

    2. 你应该只调用 srand()ONCE(你调用它多次)

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

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

    也看这里:

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

    生成的数字并不是真正随机的;通常,它们形成一个 周期性重复的序列,周期如此之大,以至于您 出于普通目的可以忽略它。随机数生成器工作 通过记住它用来计算下一个随机数的种子值 number 并且还计算一个新的种子。

    ...

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

    【讨论】:

      猜你喜欢
      • 2011-06-25
      • 1970-01-01
      • 2020-02-22
      • 1970-01-01
      • 2012-05-22
      • 2011-05-21
      • 1970-01-01
      • 1970-01-01
      • 2013-10-22
      相关资源
      最近更新 更多