我试图使用Fortran中的内置函数生成在[0,1]中均匀分布的随机数$\xi_i $序列.序列必须是可重现的,所以我想通过索引$ i $(即序列中$\xi_i $的位置)对随机数生成器播种,而不是使用系统时钟作为种子.以下是我的代码:
module rand
contains
function generate_random(iseed) result(xi1)
!!
implicit none
integer, intent(in) :: iseed
integer, dimension(:), allocatable :: seed
integer :: i, j, n
real :: xi1
!!-generate a seed first
call random_seed(size = n)
allocate(seed(n))
seed = iseed * (/(i, i=1,n,1)/)
call random_seed(PUT = seed)
deallocate(seed)
call random_number(xi1)
!!
end function generate_random
end module rand
program test
use rand
implicit none
integer :: i, imax
imax=100
do i=1,imax
print *, generate_random(i)
enddo
end program test
Run Code Online (Sandbox Code Playgroud)
然而,在$\xi_i $绘制的情节中显示的结果与指数$ i $相比显然有一些模式,所以它毕竟不是随机的.如何改善这一点,即使其"更随机"?
我看到你在每次打电话之前播种发电机random_number.这是一个明显的滥用,你不应该这样做!
您应该使用一些可重复但不太简单的数字为发生器播种一次.即使将时钟用作种子,它也只使用一次.
通常还有一个额外的步骤来增加您的时间熵或您选择的可重复种子值.请注意https://gcc.gnu.org/onlinedocs/gcc-4.8.5/gfortran/RANDOM_005fSEED.html#RANDOM_005fSEED如何lcg()用于增加时钟值的熵
| 归档时间: |
|
| 查看次数: |
233 次 |
| 最近记录: |