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.
Est-ce un exercice? Parce que pour une utilisation réelle, vous trouverez de bonnes bibliothèques là-bas. –
"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