我非常希望能够重复生成相同的伪随机数据集,尤其是在调整实验代码时。通过观察,我会说rand()
似乎每次都给出相同的数字序列*。
是否可以保证在同一台机器/不同机器/不同架构上重复执行此操作?
*对于同一种子显然。
答案 0 :(得分:20)
是的,给定相同的程序环境。来自C标准§7.20.2.2/ 2,
srand
函数使用该参数作为后续调用rand
返回的新伪随机数序列的种子。 如果使用相同的种子值调用srand
,则应重复伪随机数序列。如果在调用rand
之前调用srand
如果已经进行了生成,则应该在第一次调用种子值为1时srand
生成相同的序列。
当然,这假设它使用相同的实现细节(即相同的机器,在相同的执行期间使用相同的库)。 C标准没有强制要求标准的随机数生成算法,因此,如果使用不同的C标准库运行程序,可能会得到不同的随机数序列。
如果您需要具有给定种子的可移植且有保证的随机数序列,请参阅问题Consistent pseudo-random numbers across platforms。
答案 1 :(得分:2)
保证为传递给srand()
的相同种子提供相同的序列 - 但仅在单次执行程序期间。通常,如果某个实现可以选择行为,则该选择在后续执行中保持不变的特定要求。
在每个程序启动时选择“主种子”的实现是合规的,并且使用它来以每次程序启动时不同的方式扰乱伪随机数生成器。
如果您希望获得更多确定性,则应在程序中实施具有特定参数的PRNG。
答案 2 :(得分:1)
没有
C标准说:
如果srand随后被调用 种子价值,序列 伪随机数应为 重复。
但是它没有说明伪随机数的实际序列是什么 - 因此它在实现中有所不同。
唯一的保证是rand()
将为给定的实现提供给定种子的相同序列号。不能保证不同机器或不同架构的顺序是相同的 - 而且几乎肯定不会。
答案 3 :(得分:0)
如果您需要使用完全相同的伪随机数集进行实验,您可以做的一件事是使用srand
生成一长串随机数并将它们写入文件/数据库。然后,编写一个便携式“随机数生成器”函数,该函数从该文件顺序返回值。这样,无论平台,srand
实现或种子值如何,您都可以放心使用相同的输入数据。
答案 4 :(得分:0)
当切换到不同的机器/运行时/无论你运气不好。 drand48
函数族还有另一种可能的选择。这些被规范化以在所有机器上使用相同的算法。
答案 5 :(得分:0)
如果你在UNIX / Linux环境中,你可以在你的手册页上看到 drand48()和 srand48(),如果你不是,你可以看到{{ 3}}用于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;
}