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 :

Mélanger / mixer / Shuffle un Tlistbox ou array


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    893
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 893
    Par défaut Mélanger / mixer / Shuffle un Tlistbox ou array
    salut

    je cherchais à très bien mélanger un Tlistbox ou un array (ils contiendront des nombres de 1 à 60)

    j'ai cherché sur le forum, et les morceaux de code trouvés ne fonctionnent pas correctement ou alors le mélange n'est pas efficace

    sur delphi about ou je trouve toujours tout, j'ai trouvé un code qui me semblait intéressant :

    http://delphi.about.com/cs/adptips20...ltip1003_4.htm

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    Place a TButton (Button1) and a TListBox (ListBox1) and try:
     
    ~~~~~~~~~~~~~~~~~~~~~~~~~
    procedure Shuffle(
       var aArray;
       aItemCount: Integer;
       aItemSize: Integer) ;
    var
       Inx: Integer;
       RandInx: Integer;
       SwapItem: PByteArray;
       A: TByteArray absolute aArray;
    begin
       if (aItemCount > 1) then
       begin
         GetMem(SwapItem, aItemSize) ;
         try
           for Inx := 0 to (aItemCount - 2) do
           begin
             RandInx := Random(aItemCount - Inx) ;
             Move(A[Inx * aItemSize], SwapItem^, aItemSize) ;
             Move(A[RandInx * aItemSize],
                  A[Inx * aItemSize], aItemSize) ;
             Move(SwapItem^, A[RandInx * aItemSize],
                  aItemSize) ;
           end;
         finally
           FreeMem(SwapItem, aItemSize) ;
         end;
       end;
    end;
     
    procedure TForm1.Button1Click(Sender: TObject) ;
    var
       a: array[1..54] of Integer;
       i: Shortint;
    begin
       Randomize;
       for i := Low(a) to High(a) do a := i;
       Shuffle(a, High(a), SizeOf(Integer)) ;
       ListBox1.Clear;
       for i := 1 to High(a) - 1 do
         ListBox1.Items.Add(IntToStr(a)) ;
    end;
    ~~~~~~~~~~~~~~~~~~~~~~~~~
    mais ça ne fonctionne pas !

    j'ai les messages d'erreur :

    [Erreur] Unit1.pas(66): Types incompatibles : 'Array' et 'Shortint'
    [Erreur] Unit1.pas(70): Aucune version surchargée de 'IntToStr' ne peut être appelée avec ces arguments


    donc voilà j'aimerais votre aide pou faire fonctionner ce code ou alors si vous avez une autre solution? il me faut quelque chose qui mélange bien ^^

    merci

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    707
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 707
    Par défaut
    J'avais trouvé ça il y a un moment, je ne sais plus où...:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    procedure Shuffle(var Tableau: TIntegerArray);
    var
      i1, i2, iSwap:Integer;
    begin
      for i1:= High(Tableau) downto 1 do begin
        { Get a random card in the range of those that have not yet been shuffled }
        i2 := Random(i1 + 1); { i2 = random position ( <= i1) }
        { Exchange card in position "i1" with random position }
        iSwap := Tableau[i1];
        Tableau[i1] := Tableau[i2];
        Tableau[i2] := iSwap;
      end;
    end;
    Par contre le i2 := Random(i1 + 1) m'étonne, j'aurais plutôt vu Random(i1)...

  3. #3
    Membre Expert

    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2002
    Messages : 1 296
    Par défaut
    Pour ton erreur de compilation, il suffit de lire le message et d'aller voir les lignes concernées (66 et 70)...

    donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       for i := Low(a) to High(a) do a := i;
    devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       for i := Low(a) to High(a) do a[i] := i;
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
         ListBox1.Items.Add(IntToStr(a)) ;
    devient
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
         ListBox1.Items.Add(IntToStr(a[i])) ;

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    893
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 893
    Par défaut
    merci à tous les 2

    GoustiFruit ton code ne fonctionne pas

    Linkin c'est ok et j'aimerais continuer avce ce code ...

    mais déjà je tiens à dire que je trouve bizarre que sur ce site il y ait une erreur de ce genre ...

    enfin bref, ça fonctionne, mais selon moi, pas assez mélangé ...

    on retrouve souvent des 26-27 ou 30-31

    ça arrive trop souvent

    vous avez une idée pour compléter ce code pour faire un mélange encore plus poussé ?

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

Discussions similaires

  1. comportement /config shuffle(array)
    Par remond dans le forum Langage
    Réponses: 5
    Dernier message: 11/03/2011, 12h06
  2. Shuffle sur un array javacript
    Par SpaceFrog dans le forum Général JavaScript
    Réponses: 25
    Dernier message: 23/02/2010, 19h54
  3. Réponses: 5
    Dernier message: 04/12/2008, 13h45
  4. Bonjour Shuffle (mélanger un vecteur)
    Par Nodoso dans le forum Scheme
    Réponses: 9
    Dernier message: 06/12/2007, 22h13

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