Générer aléatoirement un nombre d'une liste précise.

Résolu
TheCastleGaming -  
KX Messages postés 19031 Statut Modérateur -
Bonjour à tous!

(Gros) débutant en Java, je cherche un moyen de résoudre le problème suivant:
J'ai une liste de nombre (par exemple: 12 2 34 87 34 12 13 34).
Je voudrais que mon programme donne à une variable un de ces nombres de manière aléatoire.
Quelqu'un aurait-il une idée?

Merci d'avance!

2 réponses

  1. KX Messages postés 19031 Statut Modérateur 3 020
     
    Bonjour,

    Tu tires aléatoirement un entier (avec Random.nextInt) compris entre 0 et n (exclus) où n est la taille de ta liste, cet entier représentant la position dans la liste du nombre que tu vas affecter à ta variable.

    import java.util.Arrays;
    import java.util.List;
    import java.util.Random;
    
    public class Test {
        public static void main(String[] args) {
            List<Integer> list = Arrays.asList(12,2,34,87,34,12,13,34);
            Random random = new Random();
            int pos = random.nextInt(list.size());
            int x = list.get(pos);
            System.out.println(x);
        }
    }
    2
    1. Utilisateur anonyme
       
      Salut, j'aime bien cette solution ;-)

      --
      0
    2. TheCastleGaming
       
      Solution PARFAITE!
      Le problème est résolu!
      MERCI BEAUCOUP!
      0
  2. KX Messages postés 19031 Statut Modérateur 3 020
     
    Pour aller plus loin : voici une manière d'obtenir le même résultat mais de manière générique avec les lambdas fonctions (en Java 8).
    Le principe est strictement le même à part qu'on ne se limite plus à une liste d'entiers mais qu'on généralise à tout et n'importe quoi.

    Remarque : ce n'est pas un code pour débutants.

    import java.util.Random;
    import java.util.function.BiFunction;
    import java.util.function.ToIntFunction;
    
    public class Chooser {
    
        private static final Random RANDOM = new Random();
        
        /**
         * Choisit aléatoirement un élément dans un arrangement de données.
         * @param datas l'arrangement de données où prendre l'élément
         * @param sizeFunction une fonction qui permet de calculer le nombre d'éléments dans l'arrangement
         * @param getFunction une fonction qui permet de récupérer un élément dans l'arrangement connaissant sa position (entre 0 et taille-1)
         * @return l'élément choisi aléatoirement dans l'arrangement
         */
        public static <D,R> R chooseOne(D datas, ToIntFunction<D> sizeFunction, BiFunction<D,Integer,R> getFunction) {
            int size = sizeFunction.applyAsInt(datas);
            int pos = RANDOM.nextInt(size);
            return getFunction.apply(datas, pos);
        }
    }

    Exemple avec un tableau, une liste et une chaîne de caractères :

    import java.util.Arrays;
    import java.util.List;
    
    public class Test {
    
        public static void main(String[] args) {
    	
            Integer[] tab = {1,2,3,4,5,6,7,8,9};
            int a = Chooser.chooseOne(tab, x -> x.length, (x,i) -> x[i]);
            System.out.println(a);
            
            List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9);
            int b = Chooser.chooseOne(list, x -> x.size(), (x,i) -> x.get(i));
            System.out.println(b);
            
            String string = "abcdefghijklmnopqrstuvwxyz";
            char c = Chooser.chooseOne(string, x -> x.length(), (x,i) -> x.charAt(i));
            System.out.println(c);
        }
    }
    0