2016-08-15 57 views
1

我正嘗試使用Fortran中的內置函數生成一系列隨機數$ \ xi_i $,它們均勻分佈在[0,1]中。該序列必須是可重現的,所以我想通過索引$ 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

中時鐘值的熵熵使用了哪種編譯器?你應該閱讀它的文檔(如果提供)使用種子。猜測,你提供的種子中有很多零位,這對熵不利。 – francescalus

+0

我同意,你不能只使用任何你喜歡的數字作爲種子。 –

回答

6

我看你播種發電機之前每調用random_number。這是一個明顯的濫用,你不應該這樣做!

您應該使用一些可重複的但不是很簡單的號碼來播種發電機一次。即使將時鐘用作種子,它也只能使用一次。

通常有一個額外的步驟來增加你的時間熵或你選擇的可重複種子值。請注意0​​用於增加https://gcc.gnu.org/onlinedocs/gcc-4.8.5/gfortran/RANDOM_005fSEED.html#RANDOM_005fSEED

+1

是的,當我將僞隨機數生成器(PRNG)只播種一次,然後多次調用PRNG時,所得到的分佈不具有這些相關模式。現在我意識到,由於PRNG遞歸地工作,沒有方法在沒有調用PRNG k次的情況下依次查找第k個數字。謝謝。 –