Bien que ce soit un vieux fil de discussion, mais ajouter une autre option pourrait ne pas nuire. (Les fonctions lambda du JDK 1.8 semblent le rendre facile) ;
Le problème peut être décomposé en plusieurs étapes ;
- Obtenir une valeur minimale pour la liste d'entiers fournie (pour laquelle générer des numéros aléatoires uniques).
- Obtenez une valeur maximale pour la liste d'entiers fournie.
- Utilisez la classe ThreadLocalRandom (du JDK 1.8) pour générer des valeurs entières aléatoires par rapport aux valeurs entières min et max trouvées précédemment, puis filtrez pour vous assurer que les valeurs sont bien contenues dans la liste fournie à l'origine. Enfin, appliquez distinct à l'intstream pour vous assurer que les nombres générés sont uniques.
Voici la fonction avec une description :
/**
* Provided an unsequenced / sequenced list of integers, the function returns unique random IDs as defined by the parameter
* @param numberToGenerate
* @param idList
* @return List of unique random integer values from the provided list
*/
private List<Integer> getUniqueRandomInts(List<Integer> idList, Integer numberToGenerate) {
List<Integer> generatedUniqueIds = new ArrayList<>();
Integer minId = idList.stream().mapToInt (v->v).min().orElseThrow(NoSuchElementException::new);
Integer maxId = idList.stream().mapToInt (v->v).max().orElseThrow(NoSuchElementException::new);
ThreadLocalRandom.current().ints(minId,maxId)
.filter(e->idList.contains(e))
.distinct()
.limit(numberToGenerate)
.forEach(generatedUniqueIds:: add);
return generatedUniqueIds;
}
Ainsi, pour obtenir 11 numéros aléatoires uniques pour l'objet de liste 'allIntegers', nous appellerons la fonction comme suit ;
List<Integer> ids = getUniqueRandomInts(allIntegers,11);
La fonction déclare une nouvelle liste de tableaux 'generatedUniqueIds' et la remplit avec chaque entier aléatoire unique jusqu'au nombre requis avant de la retourner.
P.S. La classe ThreadLocalRandom évite une valeur de semence commune en cas de threads concurrents.
5 votes
Vous pourriez créer un permutation aléatoire de la gamme
1..100
(il existe des algorithmes célèbres pour cela), mais arrêtez-vous après avoir déterminé le premiern
éléments.0 votes
Duplicata possible de Génération de nombres aléatoires dans une plage avec Java
0 votes
stackoverflow.com/questions/28990820/
0 votes
Cela pourrait être utile Générateur d'identité aléatoire unique