2016-08-15 2 views
1

Fortran의 내장 함수를 사용하여 [0,1]에 균등하게 분포 된 난수 시퀀스 $ \ xi_i $를 생성하려고합니다. 시퀀스는 재현 가능해야하므로 시드에 시스템 클럭을 사용하는 대신 색인 $ i $ (시퀀스에서 $ \ xi_i $의 위치)로 난수 생성기를 시드하려고합니다. 다음은 내 코드입니다 : $ \ xi_i의 $가 인덱스 대 플롯 플롯에 표시된이의 결과가 $ 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 

몇 가지 패턴이있다, 그래서 결국 그렇게 무작위로하지 않습니다. 이를 개선하여 즉 '무작위'로 만드는 방법은 무엇입니까?

enter image description here

+1

어떤 컴파일러를 사용하고 있습니까? 씨앗 사용에 대한 설명서 (제공된 경우)를 읽어야합니다. 추측 하건데, 당신이 제공하는 시드에는 제로 비트가 많이 있는데, 이는 엔트로피에 좋지 않을 것입니다. – francescalus

+0

동의합니다. 원하는 번호를 시드로 사용할 수 없습니다. –

답변

6

난 당신이 random_number전에 모든 전화를 발전기를 퍼 뜨리고있다 참조하십시오. 이것은 명백한 학대이며 당신은 그것을하기로되어 있지 않습니다!

발전기를 번으로 시드해야합니다. 너무 단순하지는 않지만 반복적 인 번호를 사용하십시오. 시계가 씨앗으로 사용 되더라도 한 번만 사용됩니다.

종종 시간이나 선택한 반복 가능한 시드 값의 엔트로피를 높이기위한 추가 단계가 있습니다. 알림 lcg()을 사용하여 시계의 엔트로피를 높이는 방법 https://gcc.gnu.org/onlinedocs/gcc-4.8.5/gfortran/RANDOM_005fSEED.html#RANDOM_005fSEED

+1

예, PRNG (pseudo-random-number-generator)를 한 번만 시드 한 다음 PRNG를 여러 번 호출하면 결과 분포에는 이러한 상관 패턴이 없습니다. 이제는 PRNG가 재귀 적으로 작동하기 때문에 PRNG를 k 번 호출하지 않고 순차적으로 k 번째 번호를 찾는 방법이 없다는 것을 알았습니다. 감사. –