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

Résolu/Fermé
TheCastleGaming - 12 mars 2015 à 18:33
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 - 12 mars 2015 à 21:48
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

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
12 mars 2015 à 19:29
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
Whismeril Messages postés 19027 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 24 avril 2024 931
12 mars 2015 à 19:33
Salut, j'aime bien cette solution ;-)

--
0
TheCastleGaming
12 mars 2015 à 19:48
Solution PARFAITE!
Le problème est résolu!
MERCI BEAUCOUP!
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
12 mars 2015 à 21:48
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