IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Fortran Discussion :

Utilisation fonction ran


Sujet :

Fortran

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 31
    Par défaut Utilisation fonction ran
    Bonjour,
    quelqu'un pourrait-il m'expliquer clairement comment on utilisa la fonction RAN et SECNDS en fortran?
    En gros je dois l'utiliser dans un programme pour lancer deux des.. Donc la valeur qu'elel doit me retourner doit etre comprise entre 1 et 6..
    Merci d'avance et merci aux admin qui vont tourner ce site, il est vraiment très bien fait!

  2. #2
    Membre émérite
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Par défaut
    Salut

    En fortran 90 tu as
    random_number(plop)

    plop est un real (je crois que tu peux mettre un tableau 1D)

    Je sais pas si c'est cette fonction que tu cherches ?

    Pour avoir un nombre entre 1 et 6, sachant que plop est entre 0 et 1, cette instruction te donne un entier entre 1 et 6 (nint c'est l'entier le plus proche) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    call random_number(plop)
    val_des = nint( 5.d0 * plop + 1.d0)
    Ceci dit dans random_number tu ne maitrise rien et notamment tu ne connais pas la graine (c'est un entier qui permet d'initialiser le tirage des nombres aléatoires). Je te donne une fonction issue de numerical recipes qui donne des nombres aléatoires. La graine c'est idum ! il faut que idum soit un entier négatif assez grand, du genre idum = - 35463364 (d'après mon clavier).

    En premiere ligne de ton programme tu initialises idum et TU NE CHANGES PLUS SA VALEUR !!!!
    idum = - 35463364

    ensuite dans ton programmes tu mets

    val_des = nint( 5.d0 * ran2(idum) + 1.d0)

    et tu as une valeur entre 1 et 6 !

    La fonction est en F77 mais normalement elle devrait marcher si tu compiles tu F90. Tu peux la convertir en F90 il n'y a pas grand chose à changer.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
          FUNCTION ran2(idum)
          INTEGER idum,IM1,IM2,IMM1,IA1,IA2,IQ1,IQ2,IR1,IR2,NTAB,NDIV
          REAL ran2,AM,EPS,RNMX
          PARAMETER (IM1=2147483563,IM2=2147483399,AM=1./IM1,IMM1=IM1-1,
         *IA1=40014,IA2=40692,IQ1=53668,IQ2=52774,IR1=12211,IR2=3791,
         *NTAB=32,NDIV=1+IMM1/NTAB,EPS=1.2e-7,RNMX=1.-EPS)
          INTEGER idum2,j,k,iv(NTAB),iy
          SAVE iv,iy,idum2
          DATA idum2/123456789/, iv/NTAB*0/, iy/0/
          if (idum.le.0) then
            idum=max(-idum,1)
            idum2=idum
            do 11 j=NTAB+8,1,-1
              k=idum/IQ1
              idum=IA1*(idum-k*IQ1)-k*IR1
              if (idum.lt.0) idum=idum+IM1
              if (j.le.NTAB) iv(j)=idum
    11      continue
            iy=iv(1)
          endif
          k=idum/IQ1
          idum=IA1*(idum-k*IQ1)-k*IR1
          if (idum.lt.0) idum=idum+IM1
          k=idum2/IQ2
          idum2=IA2*(idum2-k*IQ2)-k*IR2
          if (idum2.lt.0) idum2=idum2+IM2
          j=1+iy/NDIV
          iy=iv(j)-idum2
          iv(j)=idum
          if(iy.lt.1)iy=iy+IMM1
          ran2=min(AM*iy,RNMX)
          return
          END
    C  (C) Copr. 1986-92 Numerical Recipes Software 0?#<
    Problème pour toi : à une graine correspond une série de nombre aléatoire donc si tu ne changes pas la graine les dés donneront toujours les mêmes valeurs dans le même ordre chaque fois que tu relanceras ton programme.

    La fonction ci dessous donne en premier argument un entier généralement grand qui peut être utilisé comme graine. Il donne un entier lié au bip de l'horloge de l'ordinateur.

    system_clock(count,count_rate,count_max)

    les trois variables sont des sorties de la subroutine qui sont des integer. Le premier est la valeur de l'horloge quand tu appelles la subroutine(que tu peux prendre comme graine), le deuxième c'est la fréquence de l'horloge et le troisème est la valeur max de l'horloge.

    Conseil :

    Pour débeuguer le programme il est souvent préférable d'avoir une graine fixe. De cette manière la série de nombre aléatoire est toujours la même et tu peux donc comparer les résultats issus de deux exécutions successives.

    Je ne connais pas SECNDS !

Discussions similaires

  1. Pb de blancs dans utilisation fonction FtpFindFirstFile
    Par AlvinTheMaker dans le forum MFC
    Réponses: 2
    Dernier message: 06/04/2005, 12h33
  2. Réponses: 6
    Dernier message: 24/02/2005, 09h44
  3. [GIMP] [Script-FU] Utilisation fonction gimp-curves-spline
    Par narmataru dans le forum Autres langages
    Réponses: 1
    Dernier message: 09/02/2005, 17h25
  4. [Débutant] Aide utilisation fonctions :(
    Par trakiss dans le forum Débuter
    Réponses: 10
    Dernier message: 27/08/2004, 15h59
  5. Utilisation fonction définie dans un .Dll
    Par jeab. dans le forum Windows
    Réponses: 5
    Dernier message: 23/03/2004, 16h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo