为什么c++ stdlib rand()函数在不同平台上对相同的种子给出不同的值?

Why does the C++ stdlib rand() function give different values for the same seed across platforms?

本文关键字:种子 平台 rand stdlib 函数 为什么 c++      更新时间:2023-10-16

我知道rand()函数根据给定的种子生成伪随机数,并且在给定的平台上,它将始终从相同的种子生成相同的数字序列,我想知道的是为什么它在使用相同库的平台上给出不同的序列?例如,rand()是如何实现的?

c++标准没有指定rand()函数使用什么算法。

这个功能是由在你的系统上编写标准库的人定义的:微软的标准库包含在Visual Studio中,GNU的标准库包含在GCC中。

你的编译器正在选择从哪里获得它的库,所以在同一个系统上,不同的编译器可能有不同版本的标准库。要点是一样的:规范保证了哪些函数是可用的以及它们做什么;他们不是这么做的

rand()函数将计算一个伪随机整数序列在[0,{RAND_MAX}]范围内,周期至少为2^32。

rand_r()函数将计算一个伪随机序列[0, {RAND_MAX}]范围内的整数。{RAND_MAX}的值宏必须至少为32767。)

如果以相同的初始值调用rand_r()由种子指向,表示对象之间不修改连续返回并调用rand_r(),将生成相同的序列。

srand()函数使用参数作为一个新的序列的种子随后调用rand()返回的伪随机数。如果然后使用相同的种子值(序列)调用Srand ()伪随机数应重复。如果rand()之前被调用对srand()的任何调用都将生成与当srand()第一次被调用时,种子值为1。

rand()函数将返回中下一个伪随机数序列。

这是IEEE Std 1003.1 c标准关于rand()函数应该如何表现的规定。它并没有说该如何计算这个数列。换句话说,每个实现者都可以自由选择他们自己版本的伪随机序列生成器。

你的观察表明他们利用了这种自由。

我可能还指出,rand()<cstdlib>的一部分,这或多或少是C标准库的副本,新的库将为您提供更多的灵活性和标准序列生成器,如果你有一个新的足够的c++编译器,不依赖于C - c++互操作性。