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

Pascal Discussion :

Eviter deux nombres identiques dans un tirage aléatoire


Sujet :

Pascal

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 12
    Points : 11
    Points
    11
    Par défaut Eviter deux nombres identiques dans un tirage aléatoire
    Salut,

    Je cherche à simuler le Loto : 6 variables entières tirées au sort entre 1 et 49, en évitant qu'un même nombre apparaisse deux fois.

    J'ai écrit ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    randomize;
    for :=1 to 6 do
        begin
             tableau[i]:=random(49);
             if tableau[i]:=0 then    { exclure 0 du tirage...du moins je suppose}
                    dec(i);
         end;
    Maintenant, comment faire pour qu'un nombre n'apparaisse pas deux fois ?
    Tout ce que j'ai essayé ne fonctionne pas... J'ai meme bouclé à l'infini...
    Expliquez-moi bien svp, je suis débutant en prog...

    Merci d'avance.

  2. #2
    Membre averti Avatar de charly
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    329
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 329
    Points : 358
    Points
    358
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    randomize; 
    for :=1 to 6 do 
    begin 
    tableau[i]:=random(48)+1; {pour exclure 0 c est plus pratique ;)}
      fo a:=1 to i do     if tableau[i]:=tableau[a] then tableau[i]:=random(48)+1;
     
    end;
    Le problème c'est que comme ça, si tu retires un nombre égal avec le random, ça ne marche pas, mais je pense qu'il y a peu de chances pour que ça arrive ...

  3. #3
    HRS
    HRS est déconnecté
    Membre confirmé
    Avatar de HRS
    Inscrit en
    Mars 2002
    Messages
    678
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 678
    Points : 638
    Points
    638
    Par défaut
    je vous propose la solution suivante en FreePascal

    Avant de mémoriser la boule dans la table, verifier qu'elle n'est pas déja
    mémorisée sinon refaire


    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
     
    program loto;
    uses Sysutils;
    var i,j,k : byte;
    tab : array [1..6] of byte;
    label Refaire;
    begin
    randomize;
    for i := 1 to 6 do begin
       Refaire :
       k:= random(49);
       if k = 0 then goto Refaire;
       for j := 1 to i-1 do
         if tab [j] = k then goto Refaire;
       tab[i] := k;
       end;
    for i := 1 to 6 do
       writeln (tab[i]);
    readln;
    end.
    PS : je n'ai aucune honte à utiliser un "goto"

  4. #4
    Nouveau membre du Club
    Inscrit en
    Octobre 2002
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 30
    Points : 27
    Points
    27
    Par défaut
    Je te laisse un semblant de prog mais je te garantie pas que ça marche!

    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
     
    program loto;
    var i,j,k;integer;
          tab:array[1..6] of integer;
          egal:boolean;
    begin
    randomize;
    for i:=1 to 6 do
          j:=1;
          repeat
          egal:=false;
          k:=random(48)+1;
               repeat
               if tab[j]=k then egal:=true else j:=j+1;
               until (j>i) or (egal);
          until (j>i);
    tab[i]:=k;
    end;
    Ps:il se peut que ça ne marche pas dis le moi j'y regarderais de plus pres.

  5. #5
    Membre expert
    Avatar de Eric Sigoillot
    Inscrit en
    Mars 2002
    Messages
    1 212
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 212
    Points : 3 369
    Points
    3 369
    Par défaut
    Avant de rentrer dans le détail du sujet, on va commencer par énoncer une règle fondamentale sur les boucles itératives : ne jamais modifier le compteur de boucle dans une boucle for ! Le résultat devient imprévisible en fonction du compilateur utilisé...

    Maintenant, pour éviter le zéro, la méthode de Charly est la bonne. En effet, on a l'inégalité suivante :

    0 <= Random(X) <= X - 1

    Donc :

    1 <= Random(X) + 1 <= X

    Maintenant, pour éviter de tirer plusieurs fois le même nombre, différentes soluitions sont envisageables, et on en a déjà parlé il y a quelque temps. Utilise la fonction Rechercher.

    A+

  6. #6
    Nouveau membre du Club
    Inscrit en
    Octobre 2002
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Octobre 2002
    Messages : 30
    Points : 27
    Points
    27
    Par défaut
    le code que j'ai rentré au dessus marche.En fait la boucle for correspond a la derniere case rentrée ds le tableau et je fais donc la recherche jusqu'a cette case(je ne le modifie pas) le reste on s'en fou.et cela permet d'eviter le cas ou le random sors les 2 memes a la suite (meme si c'est tres rare).

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

Discussions similaires

  1. Copier deux tables identiques dans une troisième
    Par accessgeek dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 29/04/2011, 17h43
  2. Réponses: 4
    Dernier message: 05/12/2010, 21h30
  3. Deux invites identique dans un prompt
    Par msillienne dans le forum Designer
    Réponses: 1
    Dernier message: 17/02/2009, 18h08
  4. Deux champs identiques dans la même table
    Par amne26 dans le forum Modélisation
    Réponses: 2
    Dernier message: 22/09/2008, 20h29
  5. [SQL 2005] Insertion de deux données identiques dans une table
    Par skystef dans le forum Accès aux données
    Réponses: 3
    Dernier message: 04/01/2007, 22h50

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