为什么我的随机数总是一样的?

时间:2014-05-26 18:03:48

标签: random fortran gfortran

我正在使用Fortran的random_number子例程,但是在不同的程序运行中,正在生成的数字不会改变。我应该在代码中包含什么,以便每次编译和运行程序时数字都会改变?

2 个答案:

答案 0 :(得分:8)

随机数发生器产生伪随机数。要在每次运行时获得不同的数字,您需要在程序开始时初始化random seed。这会在伪随机流中选择不同的起始位置。

答案 1 :(得分:3)

来自call(s)到random_number的伪随机数序列取决于处理器使用的算法和种子的值。

种子的初始值取决于处理器。对于某些处理器,每次程序运行时,此种子值都是相同的,对于某些处理器,它将是不同的。第一种情况给出了可重复的伪随机序列,第二种情况给出了不可重复的序列。

gfortran(版本7之前)属于第一类。因此,如果您希望获得不可重复的序列,则需要显式更改随机种子。

another answer中所述,内在random_seed可用于设置种子的值并重新启动伪随机生成器。同样,它取决于处理器,当调用是call random_seed()时(即没有put=参数)会发生什么。有些处理器会以可重复的顺序重启发生器,有些则不会。 gfortran(再次,在版本7之前)属于第一类。

对于call random_seed()产生可重复序列的处理器,将需要显式的运行时变化种子来生成不同的序列。可以在the documentation中找到旧版gfortran版本的示例。

应该注意的是,选择种子可能是一件复杂的事情。不仅存在可移植性问题,而且可能需要注意确保生成器不在低熵区域中重新启动。对于多图像程序,用户必须努力在这些图像上具有不同的序列。

最后,在Fortran 2018标准草案中有一项关于内在random_init的提案。这样可以处理选择跨调用的可重复性和(coarray)图像的清晰度的情况。