【问题标题】:Seeding Random number generator not working播种随机数发生器不起作用
【发布时间】:2015-11-28 22:38:46
【问题描述】:

我有一个使用随机生成器创建立方体的 c++ 程序。要创建立方体,我有这个:

void generateSquare() {
  int num = 0;
  srand(time(NULL));

  for (int r = 0; r < MSQUARE; r++) {
    for (int c = 0; c < MSQUARE; c++) {
      do {
        num = (rand() % (MSQUARE * MSQUARE)) + 1;
      } while (!checkUnique(num));
      cube[r][c] = num;
    }
  }
}

它只允许生成一个数字。然后将该函数包装在一个 do..while 循环中,这样如果正方形不满足特定条件,则会生成一个新正方形,直到生成满足条件的正方形为止。

问题在于它不断地一遍又一遍地生成同一个正方形。我认为 srand(time(NULL)) 会为 rand() 函数播种,以便每次调用它时它都会生成不同的随机数以创建一个新的唯一方块,但看起来这并没有发生。

void checkSquare() {
  do {
    generateSquare();
  } while (!perfect);
}

这不是实际的 do...while 循环,但可以让您了解它是如何被调用的。

如何确保种子每次都是唯一的?

【问题讨论】:

    标签: c++ random


    【解决方案1】:

    您应该只在程序开始时调用一次srand。你的种子总是相同的原因是因为time 返回秒数。由于您在循环中调用它,因此它始终具有相同的值(直到一秒钟过去)。

    此外,如果您可以使用 C++11 或更高版本,您应该查看标准库中的 pseudo-random number generation

    【讨论】:

      【解决方案2】:

      srand 设置 rand 函数的种子。如果将其设置为特定数字,它将始终返回相同的数字序列。如果你想测试一个程序,你将使用它,否则你使用 rand() 而不使用 srand()。

      http://www.cplusplus.com/reference/cstdlib/srand/

      【讨论】:

      • 来自该链接:“如果种子设置为 1,则生成器将重新初始化为其初始值,并生成与调用 rand 或 srand 之前相同的值。”因此,除非您希望它产生相同的值,否则您需要为程序的每次运行调用不同值的 srand(因此调用 time)。
      • 调用时间是为了让种子值不同。该程序可以运行一分钟并且种子值没有改变,这就是为什么我使用时间我认为这是使用 rand() 的标准,你用时间播种 srand() 因为没有两次是相同的,它应该每次需要生成种子,但时间不变。
      猜你喜欢
      • 1970-01-01
      • 2015-03-14
      • 2019-07-16
      • 2016-07-22
      • 1970-01-01
      • 2013-09-24
      • 2010-10-05
      • 2010-09-30
      • 2012-08-10
      相关资源
      最近更新 更多