我的目标是生成2D或3D几何体,而不必将其存储在磁盘上,因此我的目标是拥有任何类型的功能,而不是根据小种子生成相同的值。我不是要寻找随机值,但如果相同的话,随机的"当给出相同的种子时,返回垃圾数据,这是我正在寻找的东西。
如果我给srand()提供相同的整数,我会从rand()中得到相同的序列。这是预期的功能吗?如果没有,是否有已知的标准功能设计用于同样的事情?
虽然我在ideone和我的计算机上尝试了这个并且得到了不同的结果,但我可以理解这些功能的实现没有被描述,因此可以解释它。
答案 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
的要求是:
RAND_MAX
(最小值32767)。srand()
设置的种子确定返回的伪随机数序列。对PRNG的实施没有要求,因此每个实现都有自己的实现,但Linear Congrueantial Generators是最受欢迎的。
这个dilbert条带中提供了一个符合(虽然可以说是无用的)实现:
http://dilbert.com/strips/comic/2001-10-25/
对于那些喜欢XKCD的人(它是任何C或C ++库的完美插件; - )):
为完整起见,标准引用:
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)
如果使用相同的值为随机数生成器播种,则会产生相同的结果。您在不同的计算机上看到了不同的结果,因为它们(可能)使用了不同的随机数生成算法。