2010-08-17 48 views
5

我很喜欢能够重复生成相同的一组伪随机数据,尤其是在调整实验代码时。通过观察,我会说rand()似乎每次都给出相同的数字序列*。stdlib的rand()总是给出相同的序列吗?

是否可以在同一台机器/不同机器/不同架构上重复执行此操作?

*对于相同的种子显然。

回答

18

是的,给定的程序相同的环境。从C标准§ 7.20.2.2/2,

srand函数使用参数作为伪随机数的一个新序列的种子,以通过后续调用rand被返回。 如果srand然后被调用相同的种子值,则应重复伪随机数序列。如果rand被称为已作出srand任何呼叫之前,相同的序列应当srand首先用的1

当然种子值称为产生,这是假定它是使用相同的实现细节(即同一机器,相同执行期间的相同库)。 C标准没有规定标准的随机数生成算法,因此,如果您使用不同的C标准库运行程序,则可能会得到不同的随机数序列。

如果您需要一个带有给定种子的便携式保证随机数字序列,请参阅Consistent pseudo-random numbers across platforms问题。

+0

标准WIN ... – 2010-08-17 15:02:23

+0

确定。我同意,对于特定的运行时库,序列将是相同的。所以一旦构建了应用程序(针对特定的运行时版本),它将始终生成相同的序列。但是,这对于运行时的不同版本(即跨操作系统/体系结构/运行时版本)等是否有影响?如果这样做会暗示该标准定义了rand()算法的确切实现(否则两个独立操作系统如何确保他们符合)。 – 2010-08-17 15:07:20

+3

它没有扩展到不同版本的运行时 - 如果你动态地链接到'rand()'的实现,它可能会在不重建任何东西的情况下采取不同的动作。 – 2010-08-17 15:11:13

1

C标准表示:

如果函数srand然后用相同的 种子值调用时, 伪随机数的序列应 重复。

但是它没有说明伪随机数的实际序列是什么 - 所以它在不同的实现中有所不同。

唯一的保证是rand()将给定的实施给定的种子给出相同的数字序列。不能保证在不同的机器或不同的体系结构中序列是相同的 - 而且几乎肯定不会。

0

如果您需要为实验目的使用完全相同的一组伪随机数,您可以做的一件事是使用srand生成一个长序列的随机数并将它们写入文件/数据库。然后,编写一个便携式“随机数生成器”函数,该函数从该文件中顺序返回值。这样,无论平台,实现或种子值如何,您都可以放心使用相同的输入数据。

+0

好主意。如果我有这样的要求,我一定会采取这种方法。我的问题更多是出于好奇而不是需要一个已知的序列。 – Joe 2010-08-17 15:51:09

+0

或者你可以只写一个你自己的随机函数? – dcousens 2011-05-18 10:41:03

0

当切换到不同的机器/运行系统/无论你可能运气不好。还有另一个可能的选择drand48功能家族。这些标准化为在所有机器上使用相同的算法。

2

保证对于同一个种子传递给srand() - 仅在单个执行程序期间给予相同的序列。一般来说,如果一个实现在行为上有选择,那么这个选择在后续执行中保持不变是没有特定要求的。

这将符合在每次程序启动时选择一个“主种子”的实现,并且用它来扰乱伪随机数发生器,每次程序启动时都会有不同的方式。

如果您希望获得更多的确定性,您应该在程序中实现带有特定参数的PRNG。

0

如果你是在UNIX/Linux的环境,你可以在你的男人网页上看到的drand48()srand48()如果你不是,你可以看到online manuals为C语言。 原型可以在/usr/include/stdlib.h找到。 第一个使用在仿真中经常使用的线性同余方法。

如果提供相同的种子srand48(),即srand48(2)然后把dran48()在for循环中则该序列将成为每个时间是相同的。 即

include stdio.h 
include stdlib.h 
double drand48(); 
int main(void){ 
    int i; 
    double rn; 
    srand48(2); 
    for(i=0; i<10; i++){ 
     randNum = drand48(); 
     printf("%.6l\n", randNum); 
     return 0; 
} 
相关问题