Generation nombre aléatoire parmis liste

Sw1tch Messages postés 18 Date d'inscription samedi 29 mars 2003 Statut Membre Dernière intervention 1 juillet 2019 - 24 août 2003 à 15:34
LeGritcheOriginel Messages postés 6 Date d'inscription vendredi 30 août 2002 Statut Membre Dernière intervention 2 septembre 2003 - 25 août 2003 à 13:27
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 :-)
A voir également:

5 réponses

cs_Dobel Messages postés 333 Date d'inscription dimanche 25 mai 2003 Statut Membre Dernière intervention 23 novembre 2009 1
24 août 2003 à 17:30
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
0
Sw1tch Messages postés 18 Date d'inscription samedi 29 mars 2003 Statut Membre Dernière intervention 1 juillet 2019
25 août 2003 à 09:05
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 ]
0
LeGritcheOriginel Messages postés 6 Date d'inscription vendredi 30 août 2002 Statut Membre Dernière intervention 2 septembre 2003
25 août 2003 à 11:00
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);
}
}
0
Sw1tch Messages postés 18 Date d'inscription samedi 29 mars 2003 Statut Membre Dernière intervention 1 juillet 2019
25 août 2003 à 13:10
Erf, impressionnant, 1 ligne suffit pour remplacer l'autre methode. Et ca marche en plus ;)

Merci je vais utiliser celle la :)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
LeGritcheOriginel Messages postés 6 Date d'inscription vendredi 30 août 2002 Statut Membre Dernière intervention 2 septembre 2003
25 août 2003 à 13:27
Il existe en java plein de méthodes bien pratiques mais il faut les connaitre.
0
Rejoignez-nous