无法从 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 并且您应该查阅编译器手册。
根据我对 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 并且您应该查阅编译器手册。