我很喜欢能够重复生成相同的一组伪随机数据,尤其是在调整实验代码时。通过观察,我会说rand()
似乎每次都给出相同的数字序列*。stdlib的rand()总是给出相同的序列吗?
是否可以在同一台机器/不同机器/不同架构上重复执行此操作?
*对于相同的种子显然。
我很喜欢能够重复生成相同的一组伪随机数据,尤其是在调整实验代码时。通过观察,我会说rand()
似乎每次都给出相同的数字序列*。stdlib的rand()总是给出相同的序列吗?
是否可以在同一台机器/不同机器/不同架构上重复执行此操作?
*对于相同的种子显然。
是的,给定的程序相同的环境。从C标准§ 7.20.2.2/2,
的
srand
函数使用参数作为伪随机数的一个新序列的种子,以通过后续调用rand
被返回。 如果srand
然后被调用相同的种子值,则应重复伪随机数序列。如果rand
被称为已作出srand
任何呼叫之前,相同的序列应当srand
首先用的1
当然种子值称为产生,这是假定它是使用相同的实现细节(即同一机器,相同执行期间的相同库)。 C标准没有规定标准的随机数生成算法,因此,如果您使用不同的C标准库运行程序,则可能会得到不同的随机数序列。
如果您需要一个带有给定种子的便携式保证随机数字序列,请参阅Consistent pseudo-random numbers across platforms问题。
号
C标准表示:
如果函数srand然后用相同的 种子值调用时, 伪随机数的序列应 重复。
但是它没有说明伪随机数的实际序列是什么 - 所以它在不同的实现中有所不同。
唯一的保证是rand()
将给定的实施给定的种子给出相同的数字序列。不能保证在不同的机器或不同的体系结构中序列是相同的 - 而且几乎肯定不会。
当切换到不同的机器/运行系统/无论你可能运气不好。还有另一个可能的选择drand48
功能家族。这些标准化为在所有机器上使用相同的算法。
保证对于同一个种子传递给srand()
- 仅在单个执行程序期间给予相同的序列。一般来说,如果一个实现在行为上有选择,那么这个选择在后续执行中保持不变是没有特定要求的。
这将符合在每次程序启动时选择一个“主种子”的实现,并且用它来扰乱伪随机数发生器,每次程序启动时都会有不同的方式。
如果您希望获得更多的确定性,您应该在程序中实现带有特定参数的PRNG。
如果你是在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;
}
标准WIN ... – 2010-08-17 15:02:23
确定。我同意,对于特定的运行时库,序列将是相同的。所以一旦构建了应用程序(针对特定的运行时版本),它将始终生成相同的序列。但是,这对于运行时的不同版本(即跨操作系统/体系结构/运行时版本)等是否有影响?如果这样做会暗示该标准定义了rand()算法的确切实现(否则两个独立操作系统如何确保他们符合)。 – 2010-08-17 15:07:20
它没有扩展到不同版本的运行时 - 如果你动态地链接到'rand()'的实现,它可能会在不重建任何东西的情况下采取不同的动作。 – 2010-08-17 15:11:13