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

avec Java Discussion :

Tableaux et Random


Sujet :

avec Java

  1. #1
    Membre éclairé Avatar de stracoma
    Homme Profil pro
    Médecin
    Inscrit en
    Août 2013
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Maroc

    Informations professionnelles :
    Activité : Médecin

    Informations forums :
    Inscription : Août 2013
    Messages : 413
    Par défaut Tableaux et Random
    Bonjour à vous tous.
    Je cherche à copier les éléments d'un tableau dans un autre mais de manière aléatoire .
    J'ai donc écrit 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
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
     public static void main(String[] args) {
     
            int[]tablo1={1,2,3,4,5,6};
            int[] tablo2=new int[6];
     
            Random hasard= new Random();
            for(int i=0;i<tablo2.length;i++)
            {
                boolean oui =true;
                int x=0;
                do
                {
                   x=hasard.nextInt(tablo1.length);
                   for(int j=0;j<tablo2.length;j++)
                   {
                       if(tablo2[j]==tablo1[x])
                       {
                           oui=false;
                       }
                   }
                }while(oui=false);
                tablo2[i]=tablo1[x];
                System.out.println(tablo2[i]);   
            }
     
     
        }
    A l'affichage, j'ai un tableau avec des éléments qui se réptent, et je n'arrive pas à localiser mon erreur dans le code.
    Merci de votre aide

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    1. Problème while(oui=false); (le while du do/while)
      Le = est le signe d'affectation, pas de comparaison (qui ==). Donc ce que tu fais là, c'est affecter false à oui, puis tester oui, donc la condition est toujours false, donc il n'y a qu'une seule itération.
      D'où la répétition, puisque la recherche d'un élément déjà tiré n'a aucun effet.
    2. Donc, il faut écrire while(oui==false) (ou while(!oui) ce qui évite l'erreur possible du =/==
      Seulement, là, à part cas exceptionnel de probabilité infiniment faible, tu vas partir en boucle infinie. En effet, dès que oui est false, et que tu reboucles pour retirer un nombre aléatoire, oui reste forcément à false, et le do/while part en boucle infinie.
      Il faut le remettre à true à chaque fois qu'on refait un tirage.
      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
              for(int i=0;i<tablo2.length;i++)
              {
                  boolean oui;
                  int x=0;
                  do
                  {
                     oui=true;
                     x=hasard.nextInt(tablo1.length);
                     for(int j=0;j<tablo2.length;j++)
                     {
                         if(tablo2[j]==tablo1[x])
                         {
                             oui=false;
                         }
                     }
                  }while(oui==false);
                  tablo2[i]=tablo1[x];
                  System.out.println(tablo2[i]); 
              }
      A noter, que tu pourrais ajouter un break lorsque oui=false, puisqu'il est inutile de chercher plus loin dans tablo2 à ce moment-là.
    3. Ce que tu cherches à faire correspond à mélanger le tableau. Outre convertir le tableau en list, utiliser Collections.shuffle() puis reconvertir en tableau, on pourrait procéder ainsi :
      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
      public static void main(String[] args) {
       
              int[] tablo1 = {1,2,3,4,5,6};
              int[] tablo2 = Arrays.copyOf(tablo1, tablo1.length);
       
              Random hasard = ThreadLocalRandom.current(); // ou Random hasard= new Random();
              for (int i = tablo2.length - 1; i > 0; i--) { // boucle du dernier au premier exclu
                int j = hasard.nextInt(i + 1); // on échange l'index courant avec un au hasard
                int a = tablo2[j];
                tablo2[j] = tablo2[i];
                tablo2[i] = a;
              } 
              System.out.println(Arrays.toString(tablo2));
       
          }
      Cette méthode à l'avantage de fonctionner également si des valeurs se répètent dans ton tableau initial, ce qui n'est pas le cas de ton algorithme (boucle inifinie).

      Avec ton approche (enfin, pas tout à fait, puisque ici on va distribuer à des emplacements tirés au hasard non déjà tirés, alors que ton algorithme consiste à prendre une valeur à un emplacement au hasard non déjà prise pour les distribuer dans des emplacements successifs, mais on peut dire qu'il s'agit d'une distribution dans les 2 cas), on pourrait procéder comme suit, et qui fonctionne même en cas de valeur en double dans le tableau initial :
      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
      public static void main(String[] args) {
       
              int[]tablo1={1,2,3,4,5,6};
              int[] tablo2=new int[6];
       
              Random hasard= new Random();
              for(int i=0;i<tablo1.length;i++)
              {
                  int x=0;
                  do
                  {
                     x=hasard.nextInt(tablo2.length);
                  }while(tablo2[x]!=0); // tant que la case a déjà été remplie
                  tablo2[x]=tablo1[i];
              }
              System.out.println(Arrays.toString(tablo2));   
       
          }
       
       }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre éclairé Avatar de stracoma
    Homme Profil pro
    Médecin
    Inscrit en
    Août 2013
    Messages
    413
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : Maroc

    Informations professionnelles :
    Activité : Médecin

    Informations forums :
    Inscription : Août 2013
    Messages : 413
    Par défaut
    Bonsoir.
    Mon cher joel.drigo, je ne sais comment vous remercier.
    - Le plus important pour moi est de savoir où mon programme déconne. C'est fait (je bascule entre VB et java donc j'oublie souvent dans java de mettre == dans l'égalité, et effectivement je devrais réinitialiser le boolean oui à true à chaque début de la boucle)
    - Votre 1er code alternatif contient des notions que je n'ai jamais vus: "Arrays.copyOf(tablo1, tablo1.length)" et "ThreadLocalRandom.current()", donc je dois chercher dans les tutos
    - J'avais déjà réussi à avoir un bon résultat avec un tableau dynamique.
    - Par contre votre 2ème code alternatif, je le trouve hyper super intelligent (moins de code avec le même résultat)
    Une autre fois merci

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

Discussions similaires

  1. Recherche par fréquence dans deux tableaux
    Par djibos dans le forum Débuter
    Réponses: 1
    Dernier message: 25/01/2016, 00h46
  2. Tableaux de tableaux dans un objet avec random
    Par badibad dans le forum Langage
    Réponses: 1
    Dernier message: 23/06/2013, 14h21
  3. Tableaux et random en assembleur 8086
    Par samlk dans le forum x86 16-bits
    Réponses: 8
    Dernier message: 04/06/2011, 10h03
  4. [PHP 4] [Tableaux] Random pondéré ?
    Par trihanhcie dans le forum Langage
    Réponses: 6
    Dernier message: 24/12/2010, 20h34
  5. tableaux, random et document.write
    Par raph707 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 21/05/2006, 11h16

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