无法从 random_seed 子例程中获取所需大小的数组

Unable to get an array of required size from random_seed subroutine

根据我对 RANDOM_SEED 子程序的描述的理解, https://gcc.gnu.org/onlinedocs/gfortran/RANDOM_005fSEED.html

我试图通过将 n 作为输入参数来获得大小为 n 的数组。但是,无论我在可执行文件的参数中输入什么,我总是得到固定大小 (n = 33) 的数组。我做错了什么?

program test_random_seed
  implicit none
  integer, allocatable :: seed(:)
  integer :: n
 Character(len=2) :: inputnum

 call GETARG(1, inputnum)
 read (inputnum, *) n

  call random_seed(size = n)
  allocate(seed(n))
  call random_seed(get=seed)
  write (*, *) seed
  deallocate(seed)
end program test_random_seed

输出:

./test_random_seed.out 6
   270997589  -288181887  1948167863  -899467666   856399949  -616956193  -393084398  -169799794 -2106914961 -1327699024  -611308309  -956136276 -1047101846  1405583576 -2030082380  1642309723  -964872898  -478908624   486119102  1947066547  -722265400  -268681072   366932413  -791652926  1961977905  -349345081   465186042   808162632  -129440729  -683435376  1183730510   264749721           0
./tes_trandom_seed.out 4
   911554020  -223715509  -703604837 -1861804415  1952830407 -1126364511 -1115643071 -1251893035  1013863844  1767892501  1999133695 -1456139371 -1813327006  1135316397 -2034112324 -1863710425   749654783  1021195219  1479800515   882047462 -1297200646  1932542969 -1428989180  1078641551  -431962594 -1403398736   620407660   472937510  1677653929  1187629179  -357974360   953325445           0

我对您最后一条评论的理解是,您正在尝试初始化 n 个独立的伪随机序列并为它们提供单独的种子。这在使用 random_seed() 的标准 Fortran 中是不可能的。 random_seed() 使用的数组是 单个种子 用于单个序列。数组的大小是固定的,以指定单个种子所需的确切位数。

当使用 coarrays 时,可以使用 random_init() 为每个图像请求一个独立的序列。

您声称您正在使用梅森扭曲器。 Fortran 标准没有指定用于内部伪随机生成器的算法。旧版本的 gfortran IIRC 使用此算法,但新版本使用不同的算法。

如果您正在使用某些 third-party 梅森捻线机库,则必须使用该库提供的播种子例程。使用 random_seed() 只会影响内在的伪随机数生成器。

请注意,对于独立序列也没有调用 random_number() 的机制。当您从多个线程调用 random_number() 时会发生什么 processor-dependent 并且您应该查阅编译器手册。