可以使用rand()来生成可预测的数据吗?

时间:2014-05-15 23:14:12

标签: c++ math random probability

我的目标是生成2D或3D几何体,而不必将其存储在磁盘上,因此我的目标是拥有任何类型的功能,而不是根据小种子生成相同的值。我不是要寻找随机值,但如果相同的话,随机的"当给出相同的种子时,返回垃圾数据,这是我正在寻找的东西。

如果我给srand()提供相同的整数,我会从rand()中得到相同的序列。这是预期的功能吗?如果没有,是否有已知的标准功能设计用于同样的事情?

虽然我在ideone和我的计算机上尝试了这个并且得到了不同的结果,但我可以理解这些功能的实现没有被描述,因此可以解释它。

4 个答案:

答案 0 :(得分:4)

  

“如果我给srand()相同的整数,我会得到相同的序列   RAND()。这是一个预期的功能吗?“

是。

如果使用相同的种子为相同的随机数生成器播种,则会产生相同的结果。

标准库rand及其所有变体通常实现为Linear congruential generators。它们并非真正随机,也许更好地称为伪随机

您可能在不同的计算机上看到了不同的结果,因为它们使用的是不同的伪随机数生成算法,或者您没有提供固定种子,在这种情况下,当前系统时间通常是默认种子。

如果您需要一组固定的伪随机数据,则生成一次并存储它。

答案 1 :(得分:4)

  

如果我给srand()提供相同的整数,我会从rand()中得到相同的序列。这是预期的功能吗?

是的,见7.20.2.2:

  

7.20.2.2 srand函数

     

[...]说明

     

srand函数使用该参数作为新随机伪随机序列的种子   后续调用rand将返回的数字。 如果随后调用srand   相同的种子值,应重复伪随机数的序列。

但是,这仅适用于srand / rand的相同实现。另一个实现可能不使用相同的算法,因此不会产生相同的序列。

  

如果没有,是否有已知的标准功能可以做同样的事情?

嗯,这些函数是标准的,但仅限于它们的行为,而不是实际值(参见上面的实现说明)。最好使用C++11 predefined random number generators中的特定生成器,因为它们是标准化的。

答案 2 :(得分:3)

答案是肯定的,如果你总是使用相同的实现和相同的种子,你会得到一个可重复的序列,尽管由于rand()的质量可能很差,这可能是不明智的。 尽管如此,更好地使用<random>中的C ++随机数框架。它不仅允许跨实现的可重复序列,还提供了可靠地获得您真正想要的分发所需的一切。

现在详细说明:

rand的要求是:

  • 生成伪随机数。
  • 范围是0到RAND_MAX(最小值32767)。
  • srand()设置的种子确定返回的伪随机数序列。

对PRNG的实施没有要求,因此每个实现都有自己的实现,但Linear Congrueantial Generators是最受欢迎的。

这个dilbert条带中提供了一个符合(虽然可以说是无用的)实现:

http://dilbert.com/strips/comic/2001-10-25/

对于那些喜欢XKCD的人(它是任何C或C ++库的完美插件; - )):

enter image description here

为完整起见,标准引用:

  

7.22.2.1 rand函数

     

rand函数计算0到0范围内的伪随机整数序列   RAND_MAX。
  [...]
  RAND_MAX宏的值至少应为32767。

     

7.22.2.2 srand函数

     

srand函数使用参数作为新随机伪随机序列的种子   后续调用rand返回的数字。如果srand随后被调用   在相同的种子值下,应重复伪随机数的序列。如果兰特是   在对srand进行任何调用之前调用,应生成相同的序列   当第一次使用种子值1调用srand时。

答案 3 :(得分:1)

如果使用相同的值为随机数生成器播种,则会产生相同的结果。您在不同的计算机上看到了不同的结果,因为它们(可能)使用了不同的随机数生成算法。