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 :

Nombre aléatoire sans doublon


Sujet :

Delphi

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 321
    Points : 88
    Points
    88
    Par défaut Nombre aléatoire sans doublon
    Bonjours,

    Je suis en train de programme une fonction qui doit rendre un nombre aléatoire de 10 à 20 sans doublon.

    Voici comment j'ai voulu procédé: de crée dabord un tableau avec les valeurs de 10 à 20, mais je ne vois pas directement comment je peux faire mélanger l'ordre de cette table pour que les nombre de 10 à 20 soient bien mélangés.

    merci beaucoup pour l'aide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    born_Min  := 10;
    born_Max := 20;
     
    var a: array[born_Min .. born_Max] of Integer; 
     
      for i := born_Min  to born_Max  do a[i] := i;
    Salutations

  2. #2
    Membre éprouvé Avatar de Yurck
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2005
    Messages
    682
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 15
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2005
    Messages : 682
    Points : 912
    Points
    912
    Par défaut
    bonjour,

    il faut utiliser la fonction random pour générer un nombre aléatoire
    Et cela tant que ton tableau n'est pas rempli.
    Bien sur à chaque nouveau nombre générer il faudra vérifier qu'il ne l'a pas déjà été avant de le rentrer dans le tableau
    soit un truc du genre

    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
     
    const
      born_Min  := 10;
      born_Max := 20;
    Var
      NombreGenere  : integer;
      NouveauNombre : integer;
      i             : integer;
      DejaTrouve    : Boolean;
      a             : array[born_Min .. born_Max] of Integer;
    begin
      randomize;
      NombreGenere := born_Min-1;
     
      for i := born_Min  to born_Max  do a[i] := -1;
     
      while NombreGenere<born_Max do
      begin
        NouveauNombre := RandomFrom([born_Min..born_Max]);
        DejaTrouve    := false;
        for i := born_Min  to born_Max  do
          if a[i]=NouveauNombre then
          begin
            DejaTrouve    := true;
            break;
          end;
        if Not DejaTrouve then
        begin
          inc(NombreGenere);
          a[NombreGenere]:= NouveauNombre;
        end;
      end;
    end;
    c'est sans doute à améliorer mais pour trouver des valeurs de 10 à 20 il ne faut pas chercher trop loin.

    a+

  3. #3
    Membre éclairé Avatar de slimjoe
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Canada

    Informations forums :
    Inscription : Juin 2005
    Messages : 647
    Points : 789
    Points
    789
    Par défaut
    Est-ce que ce que tu cherches à faire est un tableau de 11 positions contenant les nombres 10 à 20 dans un ordre aléatoire ?

    Si c'est le cas, je te suggère de créer ton tableau dans le bon ordre en premier lieu et de mélanger ce dernier par la suite.

    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
    uses
       Math;
     
    procedure MaProcedure;
    const
       BORNE_MIN = 10;
       BORNE_MAX = 20;
     
    var
       i, j, iTmp: Integer;
       MonTableau: array[BORNE_MIN .. BORNE_MAX] of Integer;
     
    begin
       //On construit le tableau dans le bon ordre
       for i := BORNE_MIN to BORNE_MAX do
          MonTableau[i] := i;
     
     
       //On le mélange
       for i := BORNE_MIN to BORNE_MAX do
       begin
          j := RandomRange(BORNE_MIN, BORNE_MAX);
          iTmp := MonTableau[i];
          MonTableau[i] := MonTableau[j];
          MonTableau[j] := iTmp;
       end;
    end;

  4. #4
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 321
    Points : 88
    Points
    88
    Par défaut
    Oh, Merci beaucoup pour l'examples je vais faire quelque test pour voir le résultat mais je pense que c'est exactement sa ce que je cherche.
    Superement merci, je vous tient au courant..

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,

    Par définition, un tirage aléatoire doit pouvoir générer des doublons, sinon ce n'est pas aléatoire, même pris au sens faible de l'informatique "pseudo-aléatoire".

  6. #6
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

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

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    Je voudrais juste modifier légèrement le code de SlimJoe, car je pense qu'il ne donnera pas des permutations équiprobables - mais je n'en ai pas la preuve. En fait il s'agirait plutôt dans mon cas de ne reprendre dans le RandomRange que les indices supérieurs ou égaux à I.

    J'en ai profité pour rendre ce code plus... Réutilisable, avec une routine pour mélanger un tableau.
    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
    uses
      Math;
     
    procedure MixArray(var IntArray : array of integer);
    var I, J, Tmp : integer;
    begin
      for I := Low(IntArray) to High(IntArray)-1 do
      begin
        J := RandomRange(I, High(IntArray));
        Tmp := IntArray[i];
        IntArray[i] := IntArray[J];
        IntArray[J] := Tmp;
      end;
    end;
     
    procedure MaProcedure;
    const
      BORNE_MIN = 10;
      BORNE_MAX = 20;
    var I : integer;
        MonTableau : array[BORNE_MIN..BORNE_MAX] of integer;
    begin
      //On construit le tableau dans le bon ordre
      for I := BORNE_MIN to BORNE_MAX do
        MonTableau[i] := I;
     
      // On le mélange
      MixArray(MonTableau);
    end;

  7. #7
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 321
    Points : 88
    Points
    88
    Par défaut
    Tout fonctionne à merveille, J'aurrai encore juste une petite question d'optimisation du code, ici il faut que j'utilisie l'unité Math pour utiliser
    RandomRange, y a t -il un contre indication si je fait ceci
    ou lieu de RandomRange...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     J := Random(High(IntArray) - I + 1) + I;
    Salutations et bonne soirée.

  8. #8
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 885
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 885
    Points : 11 404
    Points
    11 404
    Billets dans le blog
    6
    Par défaut
    une très belle fonction de Columbo dans le thread :
    http://www.phidels.com/php/index.php...rum/index.php3

  9. #9
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Salut

    @Ardely

    la fonction RandomRange peut s'écrire ainsi:
    Pour deux valeurs A et B (avec A < B):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      RandomRange(A, B);
      // est égal à
      Random(B - A) + A;
    donc ta ligne est correcte et à mon avis corrige une petite erreur dans le code de sjrd, car dans celui-ci il ne doit pas y avoir de permutation effectuée sur la borne supérieure du tableau.

    @+ Claudius.

  10. #10
    Membre régulier
    Inscrit en
    Novembre 2006
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 321
    Points : 88
    Points
    88
    Par défaut
    Merci beaucoup à tous pour les examples, qui m'a bien élargie mon esprit...., Vous m'avez bien aider a résoudre mon problem. Bonne soirée.

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

Discussions similaires

  1. Tirage aléatoire sans doublon
    Par Cupidon dans le forum SAS STAT
    Réponses: 2
    Dernier message: 13/02/2013, 12h21
  2. liste de nombres aléatoire sans doublon
    Par rudyhadoux2 dans le forum Langage
    Réponses: 10
    Dernier message: 14/09/2009, 19h30
  3. Réponses: 2
    Dernier message: 27/05/2007, 23h23
  4. [MySQL] Sélection aléatoire sans doublon
    Par krapoulos2006 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 20/12/2006, 17h46
  5. Réponses: 13
    Dernier message: 08/12/2006, 11h31

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