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

 Delphi Discussion :

random non répétitif


Sujet :

Delphi

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 71
    Par défaut random non répétitif
    J'aimerais en cliquant sur un bouton afficher 20 chiffres sur 70 au hasard
    avec random mais avec tous des chiffres différent.

    Le code suivant fonctionne mais les chiffres répétitif s'affiche

    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
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Ra,i,a,p:integer;
    begin
      listbox1.clear;
      i:=1;
      randomize;
     
      for a:=1 to 21 do
      begin
        Ra:=Random(71);   //Randomize le tableau
        if i<21 then
        begin
          if Ra<>0 then
          begin
            R[i]:=Ra;
            i:=i+1;
          end;
        end;
    end;
    Merci pour votre aide

  2. #2
    Membre Expert

    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2009
    Messages
    935
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Aveyron (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2009
    Messages : 935
    Par défaut
    Une idée : tu crées un tableau de 70 booleans. Au premier coup, tu fais un random(70), et tu met la case correspondante de ton tableau a true. Au coup suivant, tu fait Nb:=random(69), et tu regarde la Nbième case du tableau qui est a false.

    A chaque tour, tu fais simplement ton Nb:=random(..), et tu comptes les cases a false jusqu'a arriver a Nb.

    Je sais pas si c'est bien clair.

    Bonne chance !

    Mick605

  3. #3
    Membre Expert
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Par défaut
    randomize s'appel au début du programme.

    ensuite, oui un tableau de boolean comme l'a dit mike :

    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
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Check : array[0..69] of boolean;
      Ra, n : integer;
    begin
      ZeroMemory(@Check[0], 70);
     
      ListBox1.items.BeginUpdate;
      try
        ListBox1.Items.Clear;
     
        for n := 1 to 21 do
        begin
          Ra := Random(70)+1;
     
          while Check[Ra] do
            Ra := Random(70)+1;
     
          Check[Ra] := true;
     
          R[n] := Ra;
          ListBox1.Items.Add(intToStr(Ra));
        end;
      finally
        ListBox1.EndUpdate;
      end;
    end;
     
     
    initialization
      Randomize;
     
    end.
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 71
    Par défaut
    Ca fonctionne bien, merci

    petite question

    Que s'ignifie ListBox1.items.BeginUpdate; et ListBox1.items.endUpdate

  5. #5
    Membre extrêmement actif
    Avatar de skywaukers
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2005
    Messages
    1 219
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 219
    Par défaut
    Bonjour,

    Citation Envoyé par cre3000 Voir le message
    Ca fonctionne bien, merci

    petite question

    Que s'ignifie ListBox1.items.BeginUpdate; et ListBox1.items.endUpdate
    Cela permet de ne pas rafraichir l'affichage à chaque ajout/modification des items, ce qui permet de gagner en performances et en fluidité pour l'utilisateur.

    @++
    Dany

  6. #6
    Membre Expert
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Par défaut
    et pour expliquer complétement :

    TListBox, TComboBox, TMemo, TRichEdit possèdent tout les quatres une propriétés de type TStrings.
    Items pour TlistBox et TComboBox et Lines pour TMemo et TRichEdit.

    les méthodes BeginUpdate et EndUpdate appartiennent à la classe TStrings.
    elles permettent de ne pas appeler l'evenement Change de cette dernière et de ne l'appeler qu'une seule fois sur EndUpdate.
    ce qui, comme l'as bien expliquer Skywaulker, evite de rafraichir l'objet visuel à chaque action sur le TStrings.

    BeginUpdate et EndUpdate, se mettent dans un bloc Try Finally, car il faut être sur que même en cas d'erreur, on mets bien fin à la mise à jours de l'objet.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    {TStrings class}.BeginUpdate;
    try
      {TStrings class}.{Action clear/add/append/sort/delete/exchange etc.}
    finally
      {TStrings class}.EndUpdate;
    end;
    quand un jours tu viendra à la conception de composant visuel, il sera parfois interessant surtout pour les objets "Liste" d'introduire ces méthode BeginUpdate et EndUpdate.
    leurs mise en place est trés simple, puisqu'il s'agit tout simplement d'un compteur, incrémenté par BeginUpdate, décrémenté par EndUpdate (et si Zero on appel la methode de notification de changement de l'objet, Change, Changed, Invalidate etc.)
    [ Sources et programmes de Dr.Who | FAQ Delphi | FAQ Pascal | Règlement | Contactez l'équipe ]
    Ma messagerie n'est pas la succursale du forum... merci!

  7. #7
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 102
    Par défaut
    La fonction RandomFrom de l'unité Math m'a servir d'inspiration pour une fonction RandomFromExclude, qui pourrait s'appliquer à ton cas, quoi que plus lente que la solution par Booleen !

    Cela regénère le tableau de possibilité restante à chaque itération

    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
    function RandomFromExclude(const InValues: TIntegerArray; out Value: Integer): TIntegerDynArray;
    var
       Index: Integer;
       FoundExclude: Boolean;
    begin
       if Length(InValues) = 0 then
          raise ERangeError.Create('Pas d''Element pour la Selection Aléatoire');
     
       Value := RandomFrom(InValues);
       SetLength(Result, Pred(Length(InValues)));
       FoundExclude := False;
       for Index := Low(InValues) to Pred(High(InValues)) do
       begin
         FoundExclude := FoundExclude or (InValues[Index] = Value);
         if FoundExclude  then
            Result[Index] := InValues[Succ(Index)]
         else
            Result[Index] := InValues[Index];
       end;
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

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

Discussions similaires

  1. HTML non répétitif ?
    Par Tidji38 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 06/10/2015, 11h38
  2. V.B.A - Sélection aléatoire non répétitif dans une liste
    Par Justinedu75 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 15/05/2013, 09h24
  3. Select random avec non équi-probabilité
    Par webrunner dans le forum Requêtes
    Réponses: 3
    Dernier message: 12/06/2010, 21h29
  4. Randomize - non répété
    Par Gregory.M dans le forum Algorithmes et structures de données
    Réponses: 17
    Dernier message: 22/01/2008, 14h44

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