【发布时间】:2021-01-11 14:49:27
【问题描述】:
gfortran page on random_seed 表示当使用 OMP 线程时,每个线程将其种子增加 2^128。我想知道如何手动将种子增加 2^128。我写了一个小测试程序将主种子设置为0,然后看看种子是什么,但我不明白我看到的是什么。我想知道的是例如我在子程序increment_by_2_tothe_128中放入的内容@
program main
implicit none
character(len=32) :: arg
integer :: n
integer :: i
integer :: nthreads
integer, allocatable :: seed(:, :)
integer, allocatable :: master_seed(:)
real, allocatable :: rn(:)
call get_command_argument(1, arg)
read(arg, *) nthreads
call random_seed(size=n)
allocate(seed(n, nthreads))
allocate(master_seed(n))
allocate(rn(nthreads))
master_seed = 0
seed = 0
call random_seed(put=master_seed)
! call increment_by_2_tothe_128(n)
call omp_set_num_threads(nthreads)
!$OMP PARALLEL DO
do i=1,nthreads
call random_number(rn(i))
call random_seed(get=seed(:,i))
end do
do i=1,nthreads
print *, i
print *, rn(i)
print *, seed(:,i)
end do
end program main
subroutine increment_by_2_tothe_128(n)
implicit none
integer, intent(in) :: n
integer :: current_seed(n)
integer :: increment_seed(n)
call random_seed(get=current_seed)
! what goes here:
! incrememt_seed = current_seed + 2**128
call random_seed(put=increment_seed)
end subroutine increment_by_2_tothe_128
【问题讨论】:
-
增量不是“将 2^128 添加到种子”而是“表现得好像已经生成了 2^128 个偏差”。那是你缺少的部分吗? (无论如何,这不是答案,因为“调用 random_number 2*128 次”并不合适。)
标签: fortran gfortran random-seed