2017-10-14 6 views
0

J'ai programmé un générateur linéaire-congruentiel qui imprime 10000 valeurs pseudo-aléatoires au terminal. Cela fait partie d'un module, et donc de sa propre fonction. Je veux maintenant écrire une nouvelle fonction qui prend 2 nombres aléatoires distribués uniformément et les utilise dans la méthode de la boîte de Muller pour générer 2 nombres supplémentaires. Je comprends la partie boîte de Muller lui-même, je ne comprends tout simplement pas comment je programme pour prendre seulement 2 valeurs de la précédente 10000? Voici mon code:Comment écrire une fonction qui utilise 2 valeurs d'une autre fonction qui génère 10000 valeurs?

module rng 
    implicit none 

    integer, parameter :: dp = selected_real_kind(15,300) 
    real(kind=dp) :: A=100, B= 104001, M = 714025 

contains 

function lcg(seed) 
    integer :: lcg 
    integer, optional, intent(in) :: seed 
    real(kind=dp) :: x = 0 

    if(present(seed)) x = seed 
    x = mod(A * x + B, M) 
    lcg = x 
end function 

end module 


program lcgtest 
    use rng 
    implicit none 
    integer :: N 


    do N = 1, 10000 
    print *, lcg() 
    end do 
end program 

Merci.

+0

Est-ce un exercice? Parce que pour une utilisation réelle, vous trouverez de bonnes bibliothèques là-bas. –

+0

"pour prendre seulement 2 valeurs par rapport aux 10000 précédentes". Littéralement, vous enregistrer les 10000 valeurs dans un tableau. Quels critères utilisez-vous pour choisir les deux? et pourquoi voudriez-vous le faire comme ça? – agentp

Répondre

1

Votre fonction génère 1 entier, pas 1000. Il suffit de l'appeler deux fois et vous avez deux nombres.

do 
    a = lcg() 
    b = lcg() 

    !do something with a and b 
end do