Generation nombre aléatoire parmis liste

Signaler
Messages postés
18
Date d'inscription
samedi 29 mars 2003
Statut
Membre
Dernière intervention
1 juillet 2019
-
Messages postés
6
Date d'inscription
vendredi 30 août 2002
Statut
Membre
Dernière intervention
2 septembre 2003
-
Salut,

J'aimerais pouvoir générer un nombre aléatoire parmis une liste.

Je prends un nombre aléatoire entre 1 et 78 avec (int)(Math.random() *78 + 1) ;
Ensuite, j'aimerais que ce nombre disparaisse des possibilité. Par exemple si j'ai recu 54, le prochain nombre généré doit être entre 1 et 78 SAUF 54. Je doit générer absolument les 78 chiffres, seule l'ordre doit etre aléatoire.

J'ai fait un petit test. Si le nombre est pris, je lui mets une variable à false s'il est libre true.
Et je génère un nombre aléatoire dans un do{} while tant que la variable relative au nombre = false .

Seul problème plus je génère de chiffres, plus les possibilités sont restreinte alors que la fonction continue avec des nombres de 1 à 78. Resultat j'arrive à la fin à une boucle quasi-infinie.

Si qqun a une solution je suis preneur :-)

5 réponses

Messages postés
333
Date d'inscription
dimanche 25 mai 2003
Statut
Membre
Dernière intervention
23 novembre 2009
1
Salut
2 petites méthodes. je sais pas laquelle est la + rapide
la 2ème utilise le Vector de java.util donc c'est peut-être un peu plus lourd

    int[] liste = new int[78];//liste des 78 nombres
    int[] listeAleat = new int[78];//liste mélangée
    int[] liste2;//liste intermédiaire
    for (int i=0; i<78; i++) liste[i]=i+1;
    for (int i=0; i<78; i++) {
      int n = (int)(Math.random()*(78-i)+1)-1;
      listeAleat[i] = liste[n];
      liste2 = new int[liste.length-1];
      for (int j=0; j<n; j++) {
        liste2[j] = liste[j];
      }
      for (int j=n; j<liste2.length; j++) {
        liste2[j] = liste[j+1];
      }
      liste = liste2;
    }
    for (int i=0; i<78; i++) {
      System.out.print(listeAleat[i]+" ");
    }


et la 2ème :
    Vector liste = new Vector();
    int[] listeAleat = new int[78];
    for (int i=0; i<78; i++) liste.add(new Integer(i+1));
    for (int i=0; i<78; i++) {
      int n = (int)(Math.random()*(78-i)+1)-1;
      listeAleat[i] = ((Integer) liste.elementAt(n)).intValue();
      liste.removeElementAt(n);
    }
    for (int i=0; i<78; i++) {
      System.out.print(listeAleat[i]+" ");
    }


DOBELIOU
Messages postés
18
Date d'inscription
samedi 29 mars 2003
Statut
Membre
Dernière intervention
1 juillet 2019

Merci de m'avoir aidé, ca marche très bien.

La 2ème n'est pas vraiment plus lente [c'est imperceptible] si tu utilises des ArrayList [jdk 1.2, les vectors datent du jkd1.0 est sont déprécié... dixit Jbuilder :-p ]
Messages postés
6
Date d'inscription
vendredi 30 août 2002
Statut
Membre
Dernière intervention
2 septembre 2003

Il existe une méthode shuffle dans la classe Collections qui permet de mélanger les éléments d'une liste :

import java.util.*;

class r
{
public static void main(String[] args)
{
ArrayList list = new ArrayList(78);

for(int i=1;i<79;i++)
list.add(new Integer(i));

System.out.println(list);

Collections.shuffle(list);

System.out.println(list);
}
}
Messages postés
18
Date d'inscription
samedi 29 mars 2003
Statut
Membre
Dernière intervention
1 juillet 2019

Erf, impressionnant, 1 ligne suffit pour remplacer l'autre methode. Et ca marche en plus ;)

Merci je vais utiliser celle la :)
Messages postés
6
Date d'inscription
vendredi 30 août 2002
Statut
Membre
Dernière intervention
2 septembre 2003

Il existe en java plein de méthodes bien pratiques mais il faut les connaitre.