为什么在C ++ STDLIB rand()函数的跨平台相同的种子给不同的值?(Why does t

2019-07-20 15:28发布

据我所知, rand()函数生成基于种子它被赋予的伪随机数,并在给定的平台上,将始终从相同的种子产生相同的数字序列,我想知道的是,为什么它给所有使用相同的库平台的不同序列? 即如何rand()来实现?

Answer 1:

C ++标准没有规定使用什么算法的rand()函数。

微软随Visual Studio和GNU家伙与GCC包装标准库标准库:该功能是通过谁写的标准库您的系统上定义。

你的编译器使得它得到了库从选择,所以你可能有不同版本的同一系统的不同的编译器的标准库。 点仍然是相同的:规范保证可用的功能和他们做什么; 不,他们是怎么做到的。



Answer 2:

的rand()函数应在范围[0,{RAND_MAX}]用一段至少2 ^ 32计算的伪随机整数的序列。

所述rand_r()函数应在范围计算伪随机整数的序列[0,{RAND_MAX}]。 (在{} RAND_MAX宏的值应至少为32767)

如果rand_r()被调用以相同的初始值用于对象指向种子和该对象不连续回报之间修改和调用rand_r(),应产生相同的序列。

的函数srand()函数使用的参数作为伪随机数的一个新序列的种子,以通过后续调用返回到兰特()。 如果srand()函数,然后用相同的种子值调用时,伪随机数的序列应重复。 如果兰特()的任何呼叫之前调用srand()函数是由,相同序列应按时srand()函数首先用1:1的种子值称为产生。

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

这是什么,IEEE标准1003.1 C-标准说关于如何rand()函数应该表现。 它并没有说明顺序应如何计算什么。 换句话说,每一个实现者可以自由选择自己的伪随机序列生成器的版本。

您的意见表明,他们已经采取了自由的优势。

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



文章来源: Why does the C++ stdlib rand() function give different values for the same seed across platforms?
标签: c++ c random std