我非常喜欢能够重复生成相同的伪随机数据,特别是在调试实验性代码时。通过观察,我会说rand()
似乎每次都给出相同的数字序列。
它保证在相同的机器上/不同的机器上/不同的架构上重复执行时会这样吗?
*显然是相同的种子。
我非常喜欢能够重复生成相同的伪随机数据,特别是在调试实验性代码时。通过观察,我会说rand()
似乎每次都给出相同的数字序列。
它保证在相同的机器上/不同的机器上/不同的架构上重复执行时会这样吗?
*显然是相同的种子。
是的,在相同程序环境下可以。根据C标准 §7.20.2.2/2,
srand
函数使用参数作为伪随机数新序列的种子,以便在后续调用rand
时返回。如果使用相同的种子值调用srand
,则将重复伪随机数序列。如果在调用srand
之前调用rand
,则生成的序列与使用值为1的种子值首次调用srand
时相同。
当然,这假设它正在使用相同的实现细节(即同一台机器,在相同执行期间使用相同库)。C标准没有强制规定标准的伪随机数生成算法,因此,如果您使用不同的C标准库运行程序,则可能会得到不同的伪随机数序列。
如果需要具有给定种子的可移植和保证的随机数序列,请参见问题跨平台的一致伪随机数。
srand()
传递相同的种子会保证在程序单次执行期间生成相同的序列,但通常情况下,如果实现可以选择行为,则没有特定的要求使该选择在后续执行中保持不变。不。
C标准规定:
如果使用相同的种子值调用srand,则伪随机数序列将重复。
但是,它并没有说明伪随机数序列实际上是什么-因此在不同的实现中会有所不同。
唯一的保证是,对于给定的实现,rand()
将为给定的种子提供相同的数字序列。不能保证在不同的计算机或不同的架构之间序列将相同-几乎肯定不会。
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;
}
当切换到不同的机器/运行时/任何其他情况时,您可能会遇到麻烦。还有另一种可能的选择是drand48
函数族。这些函数被规范化为在所有机器上使用相同的算法。
rand()
的实现,可能会在不重新构建任何内容的情况下表现不同。 - JoeGsrand()
时会得到相同的序列(“如果srand
然后被调用…”意味着它发生在同一程序内)。实现可以在程序启动时选择一个“主种子”,这会使算法在每次运行程序时都有所不同,这也是符合规范的。 - caf