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

Ada Discussion :

Comment obtenir un entier aléatoire ?


Sujet :

Ada

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 7
    Points : 1
    Points
    1
    Par défaut Comment obtenir un entier aléatoire ?
    Bonjour,

    j'ai vainement effectué des recherches sur le net pour savoir comment générer un entier aléatoire et voici mon problème avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    with Ada.Numerics.Discrete_Random;
    with Ada.Text_IO;
    procedure Roulette is
       type Numero is range 0 .. 36;
       package La_Roulette is new Ada.Numerics.Discrete_Random (Numero);
       use La_Roulette;    -- Rend Generator, Reset et Random visibles
       A : Numero;
       G : Generator;
    begin
       Reset (G);          -- Initialise le générateur (à faire une seule fois)
       A := Random (G);    -- Tire un nombre au hasard entre 0 et 36
       Ada.Text_IO.Put_Line ("Le numéro est: " & Numero'Image (A));
    end Roulette;
    Problème 1 : si je boucle cette opération, j'obtiens à chaque fois le même nombre

    Problème 2 : j'aimerais convertir cette procédure en fonction, malheureusement cette méthode ne semble pas renvoyer d'entier et j'ai un message d'erreur à la compile quand je fais un "return A" sachant que ma fonction doit renvoyer un entier.

  2. #2
    Inactif Avatar de Hibou57
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    852
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 852
    Points : 493
    Points
    493
    Par défaut
    Bonjour PapaGalli

    Pour le problème N°1 : si tu appel la procédure roulette en boucle, c'est normal que tu obtienne toujours le même nombre, parce que tu réinitialise le générateur également à chaque appel, et le nombre aléatoire que tu obtiens est alors toujours le premier de la série, et donc toujours le même. Pour comprendre il faut savoir que les générateurs de nombres aléatoires informatiques sont en fait des générateurs pseudo-aléatoires : ils dépendent d'un état initial, et depuis un même état initial, ils générent toujours une suite exactement identique (les véritables générateurs de nombres aléatoires font appel à des phénomène physique, leur pendant logiciel ne font que simuler le hasard). L'état initial employé est souvent basé sur l'heure ou la date système, et donc si ta boucle se fait rapidement, le générateur est chaque fois re-initialisé avec le même état initial. Tu comprends ?

    Pour le problème N°2 : si la fonction doit renvoyer le résultat du tirage, et que le tirage est du type Numero, alors ta fonction devrait plutôt renvoyer un type Numero, et non pas un type Integer... à moins qu'il n'y ait une bonne raison particulière pour renvoyer un Integer et pas autre chose... Pour quelle raison voulais-tu lui faire renvoyer un Integer PapaGalli ?
    ------------------------------------------------------------
    Sur le web, c'est la liberté qui est gratuite, mais bien évidement pas la consomation ... et encore moins la consomation à outrance
    ------------------------------------------------------------
    Language shapes the way we think, and determines what we can think about [ B. Lee Whorf ] ... mais ce n'est pas tout à fait vrai à 100%...
    ------------------------------------------------------------
    Pascal (FreePascal?) - Ada (Gnat-3.15p)
    XSLT (XSLTProc) - CGI binaires (Ada/C) [ Clavier Arabe ]
    ------------------------------------------------------------

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    merci de ta reponse

    pour la fonction qui renvoit un numero j'ai deja essayé et ca ne passe pas a la compil et dans le programme principal je manipule des integer.

    mais j'ai resolu ce probleme en laissant sous forme de procedure avec un parametre de sortie que je converti en faisant integer(A).

    sinon pour le probleme de random j'ai integré une boucle de 100 iterations dans laquelle je fais un reset(G). c'est un peu du bricolage mais ca a l'air de marcher.

    je suis en train de programmer un tsp par methode d'opitmisation par colonie de fourmis si ca peut interesser des gens.

  4. #4
    Inactif Avatar de Hibou57
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    852
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 852
    Points : 493
    Points
    493
    Par défaut
    Citation Envoyé par papagalli
    [...] je suis en train de programmer un tsp par methode d'opitmisation par colonie de fourmis si ca peut interesser des gens.
    Oh ouiiii! moi je veux bien savoir ce que c'est...... ça a l'air very interesting

    Sinon pour l'ancien problème, est-ce que tu peux donner le code complet de ta boucle ? ... il y a peut-être quelque chose, un truc... ça me semble étrange en tous cas.
    ------------------------------------------------------------
    Sur le web, c'est la liberté qui est gratuite, mais bien évidement pas la consomation ... et encore moins la consomation à outrance
    ------------------------------------------------------------
    Language shapes the way we think, and determines what we can think about [ B. Lee Whorf ] ... mais ce n'est pas tout à fait vrai à 100%...
    ------------------------------------------------------------
    Pascal (FreePascal?) - Ada (Gnat-3.15p)
    XSLT (XSLTProc) - CGI binaires (Ada/C) [ Clavier Arabe ]
    ------------------------------------------------------------

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    PROCEDURE Roulette (
             Rd :    OUT Integer) IS
          TYPE Numero IS RANGE 1 .. 100;
          PACKAGE La_Roulette IS NEW Ada.Numerics.Discrete_Random (Numero);
          USE La_Roulette;    -- Rend Generator, Reset et Random visibles
          A : Numero;
          G : Generator;
       BEGIN
          FOR I IN 1..500 LOOP
             Reset (G);       -- Initialise le générateur (à faire une seule fois)
          END LOOP;
          A := Random (G);    -- Tire un nombre au hasard entre 0 et 36
          Rd :=Integer(A);
       END Roulette;

  6. #6
    Membre éprouvé
    Avatar de Celelibi
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    1 087
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 1 087
    Points : 1 122
    Points
    1 122
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
          FOR I IN 1..500 LOOP
             Reset (G);       -- Initialise le générateur (à faire une seule fois)
          END LOOP;
    Si ta procédure roulette doit être appellée plusieurs fois rapidement, il faut alors définir le générateur à l'exterieur de la procédure roulette, puis le passer en paramètre (ou faire en sorte qu'il ait une visibilité suffisante).

    Initialiser plusieurs fois un même générateur n'a pas vraiment de sens.

    De plus, pourquoi ta procédure renvoie un integer, alors que c'est un type Numero qui a été généré ?

    Peut-être que ton type Numero devrait être exterieur à ta procédure roulette.



    Généralement quand on fait un cast juste parceque "y'a Ada qui râle", c'est souvent un problème plus profond.
    Les vaches ne peuvent PAS voler, quoi qu'elles aient pu vous raconter.

  7. #7
    Inactif Avatar de Hibou57
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    852
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 852
    Points : 493
    Points
    493
    Par défaut
    Citation Envoyé par Celelibi
    [...]
    Généralement quand on fait un cast juste parceque "y'a Ada qui râle", c'est souvent un problème plus profond.
    Bien vu Cel.. heuuu Celelibi...

    Suggestion : subtype Numero is Integer range 0..36;

    Papagalli.. est-ce que tu sais interpréter cette déclaration ? Tu connais « subtype » ? Et tu comprends « Integer range » au lieu de « range » tout court » ?

    Pour la boucle, oui, je me demandais aussi, parce que je la revois pareil, avec à nouveau l'initialisation répétée à chaque itération... alors j'essayais de comprendre d'où lui viens cette ch'tite erreur, mais je vois pas. ... enfin, si, je crois que je vois.. peut-être qu'il/elle essaie de « forcer » la l'initialisation. Ce serait pour ça que l'initilisation est apppelé plusieurs fois de suite (pour insister). C'est surement ça le « bricolage » dont-il/elle parlait.

    Mais comme tu dis Celelibi, le mieux et de placer l'initialisation à l'extérieur : elle doit être globale au programme (le meilleur endroit pour le faire, c'est au tout début du programme).
    ------------------------------------------------------------
    Sur le web, c'est la liberté qui est gratuite, mais bien évidement pas la consomation ... et encore moins la consomation à outrance
    ------------------------------------------------------------
    Language shapes the way we think, and determines what we can think about [ B. Lee Whorf ] ... mais ce n'est pas tout à fait vrai à 100%...
    ------------------------------------------------------------
    Pascal (FreePascal?) - Ada (Gnat-3.15p)
    XSLT (XSLTProc) - CGI binaires (Ada/C) [ Clavier Arabe ]
    ------------------------------------------------------------

  8. #8
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    en fait j'avais eu des problemes d'incompatibilité entre le type numéro et le type integer.

    pour ce qui est de sortir le generator j'ai pas tout pigé désolé... ca fait longtemps que j'ai plus fais d'ada du coup y a plein de subtilités qui m'echapent et je dois rendre le boulot demain. j'ai vaguement essayé de le faire mais sans reussite.

    Pour ce qui est de mettre une boucle à l'interieur, en effet c'est du bricolage mais au final ca a l'air de marcher puisque tous mes nombres obtenus sont différents.

  9. #9
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    dans la foulée est ce que vous savez comment arrondire un entier à 2 décimales ? j'avais trouvé comment le faire à l'affichage avec ada.Float_Text_IO.Put(5.3235435,4,2,0); par exemple.

    mais le probleme c'est que j'essaie de l'ecrire dans un fichier en utlisant
    Ada.Text_Io.Put(F2, Float'Image(Mphero(I,J))) ; et la ca ne marche plus si je tente de l'ecrire
    Ada.Text_Io.Put(F2, Float'Image(Mphero(I,J)),4,2,0)

    arrondir mon entier avant me permetrait de contourner le probleme mais je n'ai pas trouvé comment le faire.

  10. #10
    Inactif Avatar de Hibou57
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    852
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 852
    Points : 493
    Points
    493
    Par défaut
    Beh alors Papagalli, qu'est-ce qu'il t'arrive ?

    .... tu fais tout simplement ça voyons :
    Ada.Float_Text_IO.Put (F2, 5.3235435, 4, 2,0 );
    ------------------------------------------------------------
    Sur le web, c'est la liberté qui est gratuite, mais bien évidement pas la consomation ... et encore moins la consomation à outrance
    ------------------------------------------------------------
    Language shapes the way we think, and determines what we can think about [ B. Lee Whorf ] ... mais ce n'est pas tout à fait vrai à 100%...
    ------------------------------------------------------------
    Pascal (FreePascal?) - Ada (Gnat-3.15p)
    XSLT (XSLTProc) - CGI binaires (Ada/C) [ Clavier Arabe ]
    ------------------------------------------------------------

  11. #11
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    justement ca marche pas ... m'enfin j'ai peut etre ecrit de la merde c'etait 3h du mat !

  12. #12
    Inactif Avatar de Hibou57
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    852
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 852
    Points : 493
    Points
    493
    Par défaut
    Citation Envoyé par papagalli
    [..] m'enfin j'ai peut etre ecrit de la merde c'etait 3h du mat !
    Rhhôôô... je réitère : m'enfin, qu'est-ce qu'il tarrive

    Allez, allez... faut pas forcer, tu va te faire du mal... un peu de repos, un kahwa, un ciné, etc, etc ... et hop


    .... oops... bon, désolé si je radote... c'est que pour moi aussi il est tard
    ------------------------------------------------------------
    Sur le web, c'est la liberté qui est gratuite, mais bien évidement pas la consomation ... et encore moins la consomation à outrance
    ------------------------------------------------------------
    Language shapes the way we think, and determines what we can think about [ B. Lee Whorf ] ... mais ce n'est pas tout à fait vrai à 100%...
    ------------------------------------------------------------
    Pascal (FreePascal?) - Ada (Gnat-3.15p)
    XSLT (XSLTProc) - CGI binaires (Ada/C) [ Clavier Arabe ]
    ------------------------------------------------------------

  13. #13
    Nouveau Candidat au Club
    Inscrit en
    Novembre 2006
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 7
    Points : 1
    Points
    1
    Par défaut
    mon fichier est ouvert et déclaré au format texte, donc l'ecriture de float ne semble pas possible et l'arrondi de float avec text_io ne marche pas.

    j'ai contourné le probleme en affichant seulement la partie entiere apres avoir multiplié mes resultats par 100.

    pour le tsp, je l'ai terminé et ca marche relativement bien meme si il peut etre largement amélioré. (notemment avec la procedure "roulette"). en tout cas merci du coup de pouce !

    je mettrai le code quelque part si tu le veux. je crois que personne dans le monde n'a programmé un TSP en ada je vais le faire brevetter

Discussions similaires

  1. Réponses: 12
    Dernier message: 26/11/2010, 14h22
  2. comment obtenir un nombre aléatoire ?
    Par oussama0013 dans le forum Général Java
    Réponses: 4
    Dernier message: 13/05/2009, 16h31
  3. Obtenir un entier aléatoire
    Par bcaro dans le forum Scheme
    Réponses: 2
    Dernier message: 02/12/2008, 19h36
  4. [XI] comment obtenir uniquement la valeur entiere d'un nombre ?
    Par c_moi_c_moi dans le forum SAP Crystal Reports
    Réponses: 12
    Dernier message: 18/06/2007, 14h04
  5. comment obtenir une ligne aléatoirement
    Par titoumimi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 18/05/2005, 15h52

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