生成的随机数显示周期性

时间:2016-08-15 06:11:43

标签: random fortran

我试图使用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

然而,在$ \ xi_i $绘制的图中显示的结果与索引$ i $相比显然有一些模式,所以它毕竟不是随机的。如何改善这一点,即使其“更随机”?

enter image description here

1 个答案:

答案 0 :(得分:6)

我看到你在每次调用random_number之前播种发生器。这是一个明显的滥用,你不应该这样做!

您应该使用一些可重复但不太简单的数字一次对发电机播种。即使将时钟用作种子,它也只使用一次。

通常还有一个额外的步骤可以增加您的时间熵或您选择的可重复种子值。请注意lcg()如何用于增加https://gcc.gnu.org/onlinedocs/gcc-4.8.5/gfortran/RANDOM_005fSEED.html#RANDOM_005fSEED

中时钟值的熵