私は、[0,1]に一様に分布した乱数列$ \ xi_i $をFortranの組み込み関数を使って生成しようとしています。シーケンスは再現可能でなければならないので、シードにシステムクロックを使用するのではなく、インデックス$ 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 $は、私ははっきりと$インデックス$に対してプロットされたプロットに示されているが、それは後のすべてのようにランダムではないので、いくつかのパターンがあります。これを改善する、つまり「よりランダムに」する方法
どのコンパイラを使用していますか?シードの使用に関する文書(もしあれば)を読むべきです。推測すると、あなたが提供する種子にはゼロビットがたくさんあり、これはエントロピーには良いものではありません。 – francescalus
私は同意すると、シードとして好きな番号を使うことはできません。 –