【问题标题】:How does the srand function interact with time function?srand 函数如何与时间函数相互作用?
【发布时间】:2014-12-02 00:28:51
【问题描述】:

我很困惑 - 我有以下代码 - 最小值和最大值是我们的范围值。 据我了解,srand 函数采用一个值 - 种子值并返回一个伪随机整数。首先什么是伪随机整数?

// Constants
const int MIN = 50;
const int MAX = 450;

// Get the system time.
unsigned seed = time(0);

// Seed the random number generator.
srand(seed);

// Generate two random numbers.
int num1 = MIN + rand() % MAX;
int num2 = MIN + rand() % MAX;

我们还需要初始化一个时间值吗?我们可以简单地调用时间函数吗? 我相信时间函数会返回类似于部分秒数的东西 - 创建我们的随机 #? 我通常很困惑随机 # 是如何生成的。

谢谢

【问题讨论】:

标签: c++ random time int seed


【解决方案1】:

“伪随机整数”意味着它是由函数生成的(理论上它是可预测的),但很难区分输出和真正的随机值(例如,如果猴子取一个从袋子里取出数字 0-9,然后扔回去)。当然,这取决于伪随机函数的好坏。顺便说一句,标准 C/C++ rand() 对于“严肃”的加密内容来说还不够好。

如果您不使用种子初始化srand,您将始终从数字生成器中获得相同的输出值序列。使用时间值是因为假设“部分秒”部分将是相对随机的(并且获得相对便宜)。

【讨论】:

  • 这是有道理的 - 但是我们用来初始化 num1 和 num2 的 rand() 函数与我们之前设置的 srand 函数有什么关系?
  • srand 是伪随机生成器的初始化步骤(这就是它需要种子的原因)。在某种程度上,rand() 的每个后续调用都使用由伪随机生成器生成的先前值。 srand 用于启动此序列。
  • srand 然后生成一次(使用我们的种子值)对吗?如果不是 - 如果它在每次调用 rand 函数时都被初始化 - 那么我们能否获得相同的部分秒值来重复?
  • 这个想法是当你想开始新的随机序列时你只调用srand。新的rand() 调用只是重用种子。
  • 它仅用于开始伪随机值序列,仅此而已。
【解决方案2】:

这是一种确保每次运行都能获得不同随机数序列的方法,因为(可能)time() 每次运行都会有不同的值;您可以(过于简单地)将种子视为该序列的起点。

【讨论】:

    【解决方案3】:

    伪随机数是算法产生的确定性(即-随机)值序列。从历史上看,这样做的常用方法是使用简单的递归关系:Ui = f(Ui-1),其中 Ui sub> 是整数值。片刻的想法告诉您,一旦您看到 U 的重复值,所有后续值也将是重复的。这意味着序列循环。一个好的生成器是 U 看起来不相关,均匀分布在整数范围内,并且具有长周期长度的生成器。播种生成器包括在循环中选择一个入口点。如果您始终选择相同的入口点,您将始终获得相同的序列。如果您没有明确选择初始状态(种子值),那么大多数 PRNG 都有默认初始化。

    多年来,人们认识到在 1950 年代至 1980 年代常见的递归函数存在各种问题,因此很容易将它们与真正的随机性区分开来。更现代的生成器使用比单个整数更大的状态空间,并在每次调用时将高维空间向下投影到单个整数输出。这意味着您可以获得值的单独重复,但在您返回到您开始时所在的相同状态空间之前不会获得序列的重复。由于状态空间的位数呈指数增长,因此这提供了更长的可用序列。播种仍然包括初始化状态空间。

    【讨论】:

      【解决方案4】:

      据我了解,srand 函数接受一个值 - 种子值并返回一个伪随机整数。

      差不多,但不完全。它只是设置种子并返回无效。 rand 返回一个伪随机整数。

      首先什么是伪随机整数?

      伪随机整数是伪随机数生成器的整数输出。伪随机数生成器是一种生成表面随机数序列的算法。

      我们还需要初始化一个时间值吗?我们可以简单地调用时间函数吗?

      调用time函数不需要初始化任何东西。

      我相信时间函数会返回部分秒数

      不偏不倚。它返回自纪元以来的秒数。

      有关更多信息,请参阅参考文档:

      有关伪随机数生成器的基本信息,请参见例如维基百科:http://en.wikipedia.org/wiki/Pseudorandom_number_generator

      【讨论】:

      • Seed 只是一个用于初始化伪随机数生成器的值。如srand的文档中所述。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-05
      • 1970-01-01
      • 2013-05-10
      • 1970-01-01
      • 2017-07-06
      • 1970-01-01
      相关资源
      最近更新 更多