Le moyen le plus simple serait de créer une liste des nombres possibles (1..20 ou autre) et de les mélanger ensuite avec Collections.shuffle
. Il suffit ensuite de prendre le nombre d'éléments que vous voulez. C'est une excellente solution si votre portée est égale au nombre d'éléments dont vous avez besoin à la fin (par exemple, pour mélanger un jeu de cartes).
Cela ne fonctionne pas très bien si vous voulez (disons) 10 éléments aléatoires dans l'intervalle 1..10.000 - vous finirez par faire beaucoup de travail inutilement. À ce stade, il est probablement préférable de conserver un ensemble de valeurs que vous avez générées jusqu'à présent et de continuer à générer des nombres en boucle jusqu'à ce que le prochain ne soit pas déjà présent :
if (max < numbersNeeded)
{
throw new IllegalArgumentException("Can't ask for more numbers than are available");
}
Random rng = new Random(); // Ideally just create one instance globally
// Note: use LinkedHashSet to maintain insertion order
Set<Integer> generated = new LinkedHashSet<Integer>();
while (generated.size() < numbersNeeded)
{
Integer next = rng.nextInt(max) + 1;
// As we're adding to a set, this will automatically do a containment check
generated.add(next);
}
Faites attention au choix de l'ensemble cependant - j'ai très délibérément utilisé LinkedHashSet
car il maintient l'ordre d'insertion, ce qui nous intéresse ici.
Une autre option consiste à toujours progresser, en réduisant à chaque fois la portée et en compensant les valeurs existantes. Par exemple, supposons que vous vouliez 3 valeurs dans l'intervalle 0 9. À la première itération, vous générez n'importe quel nombre dans la plage 0 9 - disons que vous générez un 4.
À la deuxième itération, vous générez un nombre compris entre 0 et 8. Si le nombre généré est inférieur à 4, on le garde tel quel... sinon on lui ajoute un. Vous obtenez ainsi un résultat compris entre 0 et 9 sans 4. Supposons que nous obtenions 7 de cette façon.
À la troisième itération, vous générez un nombre compris entre 0 et 7. Si le nombre généré est inférieur à 4, on le garde tel quel. S'il est égal à 4 ou 5, on ajoute un chiffre. S'il est égal à 6 ou 7, vous ajoutez deux. Ainsi, la plage de résultats est de 0 à 9, sans 4 ni 6.