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

Random 为什么我的随机数总是一样的?,random,fortran,gfortran,Random,Fortran,Gfortran,我正在使用Fortran中的random_number子例程,但在不同的程序运行中,生成的数字不会改变。我应该在代码中包含什么,以便每次编译和运行程序时,数字都会发生变化?随机数生成器生成伪随机数。要在每次跑步中获得不同的号码,您需要在计划开始时初始化。这将在伪随机流中选择不同的起始位置。随机数生成器生成伪随机数。要在每次跑步中获得不同的号码,您需要在计划开始时初始化。这会在伪随机流中选择不同的起始位置。从调用到随机数的伪随机数序列取决于处理器使用的算法和种子的值 种子的初始值取决于处理器。对于

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

随机数生成器生成伪随机数。要在每次跑步中获得不同的号码,您需要在计划开始时初始化。这将在伪随机流中选择不同的起始位置。

随机数生成器生成伪随机数。要在每次跑步中获得不同的号码,您需要在计划开始时初始化。这会在伪随机流中选择不同的起始位置。

从调用到
随机数的伪随机数序列取决于处理器使用的算法和种子的值

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

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

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

对于
调用random_seed()
产生可重复序列的处理器,需要显式运行时变化的seed来生成不同的序列。这些较旧的gfortran版本的示例可以在中找到

应该注意的是,选择种子可能是一件复杂的事情。不仅存在可移植性问题,而且可能需要小心确保发电机不会在低熵区域重新启动。对于多图像程序,用户必须在这些图像中使用不同的序列


最后,Fortran 2018引入了标准a内在过程
random\u init
。这可以处理选择调用间的重复性和(共阵列)图像上的清晰度这两种情况。

从调用到
随机数的伪随机数序列取决于处理器使用的算法和种子值

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

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

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

对于
调用random_seed()
产生可重复序列的处理器,需要显式运行时变化的seed来生成不同的序列。这些较旧的gfortran版本的示例可以在中找到

应该注意的是,选择种子可能是一件复杂的事情。不仅存在可移植性问题,而且可能需要小心确保发电机不会在低熵区域重新启动。对于多图像程序,用户必须在这些图像中使用不同的序列


最后,Fortran 2018引入了标准a内在过程
random\u init
。这既可以处理跨调用选择重复性的情况,也可以处理(coarray)图像的清晰性。

实现这一点的方法是不带参数地调用RANDOM_SEED。在大多数实现中,这将“随机”种子。@SteveLionel由于问题被标记为gfortran,我将注意到这个实现似乎不是其中之一。@francescalus是的,确实如此。我觉得这相当令人吃惊。不过,该标准确实指出,这样的调用以“依赖于实现”的方式初始化种子,因此标准允许gfortran所做的事情。给出了一个如何随机化种子的示例,但是。。。哎呀,这并不像看上去那么糟。这种“奇怪”的行为允许随机数序列从一次代码运行到下一次代码运行是相同的。这使得对严重随机系统的测试更加容易。然而,在同一个程序中,数字是“随机的”。如果你想要不同于一次跑步的随机数,那么你可以使用随机种子。我发现这通常是一个很好的实现,方法是调用无参数的RANDOM_SEED。在大多数实现中,这将“随机”种子。@SteveLionel由于问题被标记为gfortran,我将注意到这个实现似乎不是其中之一。@francescalus是的,确实如此。我觉得这相当令人吃惊。不过,该标准确实指出,这样的调用以“依赖于实现”的方式初始化种子,因此标准允许gfortran所做的事情。给出了一个如何随机化种子的示例,但是。。。哎呀,这并不像看上去那么糟。这种“奇怪”的行为允许随机数的序列