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 :

[Fortran 77] Générateur aléatoire d'un nombre entier


Sujet :

Fortran

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut [Fortran 77] Générateur aléatoire d'un nombre entier
    Bonjour,
    J'ai un problème avec Fortran 77. J'ai des chiffres comme suivants : 1 2 3 ... N.
    N peut être égale à 1000 (par ex.), je veux utiliser la commande "rand" dans fortran 77 pour faire un programme qui peut générer aléatoirement k (exemple: k = 3) chiffres parmi N chiffres donnés mais je ne sais pas comment faire. Pourriez-vous m'aider si vous le savez. Merci beaucoup

  2. #2
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Si je comprends bien, tu souhaites obtenir 3 entiers aleatoires dans l'intervalle [1, N].
    Sachant que rand() renvoie un nombre pseudo-aleatoire dans l'intervalle [0,1], il suffit de mettre a l'echelle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
       INTEGER k(3)
       INTEGER i
       INTEGER N0, N1
       PARAMETER(N0=1, N1=1000)
     
       DO i = 1, 3
         k(i) = INT(RAND(0) * (N1 + 1 - N0)) + N0
       ENDDO

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Bonjour,
    Tu as bien compris mon problème. Mais il y a un problème avec ton truc, j'ai implanté ton programme dans mon fichier f77 mais après l'exécution de quelques tests, j'obtiens que 3 chiffres 841, 395, 784. Je veux 3 chiffres aléatoires avec chaques tests. De plus, j'ai une question à te poser si ça ne te dérange pas: Je peux changer la valeur de k et de n dans chaque test? Par exemple: 1er test, je donne n=1000, k=3 mais dans 2e test, je donne n=500, k=2. Je t'en remercie beaucoup (Mon programme est au-dessous, tu peux jeter un coup d'oeil)

    integer i,k(3),n0,n1
    parameter (n0=1,n1=1000)
    do i=1,3
    k(i) = int(rand(0)*(n1+1-n0))+n0
    enddo
    write(*,*) k
    end

  4. #4
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Pour obtenir des nombres differents a chaque lancement du programme, il faut initialiser le generateur pseudo-aleatoire en utilisant la fonction srand(). L'heure courante est une bonne valeur d'initialisation (cela garantit des nombres differents si le programme n'est pas relance dans la meme seconde).

    De plus, tu peux changer dynamiquement le nombre d'entiers a tirer et les limites de ton intervalle. Ce sont des variables comme les autres.
    Par exemple:
    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
     
          PROGRAM toto
          IMPLICIT NONE
     
          ! number of random integers to pick
          INTEGER N
          PARAMETER(N=3)
          ! picked random integers
          INTEGER k(N)
          ! loop index
          INTEGER i
          ! boundaries of the interval of random integers
          INTEGER N0, N1
          PARAMETER(N0=1, N1=1000)
          ! array to store the current time (hhmmss)
          INTEGER*4 time(3)
          ! declare rand function
          REAL rand
     
          ! init the random generator
          call itime(time)
          i = rand(time(1) + time(2) + time(3))
     
          ! pick N random numbers
          DO i = 1, N
             k(i) = INT(rand(0) * (N1 + 1 - N0)) + N0
    	 PRINT *, k(i)
          ENDDO
     
          END
    Dans cet exemple, je dimensionne le tableau k a N dimensions car N est connu a la compilation. Si tu veux quelque-chose de plus flexible, il suffit de declarer k comme etant un tableau 'suffisamment grand' (de dimension NMAX = 100, par exemple), puis de demander ensuite la veritable valeur de N a l'utilisateur (ne pas oublier de verifier que N n'est pas superieur a NMAX). Il est possible de faire encore plus flexible, et d'allouer la memoire dynamiquement, mais c'est plus complique.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Bonjour,
    J'ai bien compris ton programme, j'ai fait des tests et ça marche bien. Merci beaucoup encore une fois. Bien cordialement

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1
    Points : 1
    Points
    1
    Par défaut //
    ton programme ne marche pas (en tout cas chez moi)
    et je n'arrive pas a le reproduire
    peut tu m'en faire un qui trouve une valeur aléatoire entre 1 et 7 (1 et 7 compris)

    ps comment faire pour que le programme trouve l'heure


    merci

  7. #7
    Membre habitué Avatar de Grame
    Profil pro
    Inscrit en
    Août 2007
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Août 2007
    Messages : 148
    Points : 192
    Points
    192
    Par défaut
    Citation Envoyé par jiji-net Voir le message
    ton programme ne marche pas (en tout cas chez moi)
    Les routines itime et rand ne font pas partie de la norme FORTRAN 77.
    Quelle(s) erreur(s) as-tu ?

    ps comment faire pour que le programme trouve l'heure
    Id. Ca n'est pas prévu en FORTRAN77 mais tu trouveras tout ce qu'il te faut en Fortran90/95. Sous linux tu as gfortran (et g95), et g95 sous Windows.
    En 2008, il est peut-être temps d'abandonner ce (bon) vieux FORTRAN77 et passer au Fortran 90 ou 95

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    110
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 110
    Points : 130
    Points
    130
    Par défaut
    Voire 2003 (pour troller un peu )

    La dernière version de gfortran commence déjà à intégrer des fonctionnalités Fortran 2003.

  9. #9
    Membre du Club
    Inscrit en
    Juin 2008
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 39
    Points : 41
    Points
    41
    Par défaut
    bonsoir tous le monde;
    la génération des nombres aléatoires est bien expliquer ci-dessus, moi je veux ce tableau qu'il soit trier d'une manière croissante

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 15/10/2009, 21h18
  2. Réponses: 2
    Dernier message: 07/09/2009, 15h28
  3. Fonction de tri nombres entiers aléatoires
    Par mabengos dans le forum Assembleur
    Réponses: 2
    Dernier message: 12/10/2008, 09h54
  4. Générer des nombres entiers de manière aléatoire
    Par stefsas dans le forum SAS Base
    Réponses: 2
    Dernier message: 12/09/2008, 10h55
  5. Réponses: 2
    Dernier message: 27/05/2007, 22h23

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