import java.util.*; /** * Générateur de nombres aléatoires uniques * ---------------------------------------- * Dans les jeux il est souvent nécessaire de générer des nombres * aléatoires qui ne se répètent pas (1) et dont la suite n'est pas * identique à chaque lancement du programme (2). * La classe suivante répond à cette problématique de façon suivante : * - Le générateur de nombres aléatoires est initialisé à partir de l'horloge (2) * - Chaque nombre tiré au sort est placé dans une liste à condition qu'il n'y * figure pas (1). * * @author Daniel Tschirhart * @version 1.0 */ class Rnd { private List tirage; private Iterator listIterator; /** * Construit le générateur * @param n : quantité de nb à générer * @param nMax : plage des nombres à générer 0..nMax-1 (n <= nMax) * @throws ExceptionParametrageErroné * */ public Rnd(int n, int nMax) throws ExceptionParametrageErroné { if (n > nMax) throw new ExceptionParametrageErroné(); tirage = new ArrayList(n); Random random = new Random(); Date t = new Date(); random.setSeed(t.getTime()); // Ajout des nombres tirage.add(random.nextInt(nMax)); for (int i = 1; i < n; i++) { int r = random.nextInt(nMax); int j = 0; while (j < i) { if (tirage.get(j) == r) { r = random.nextInt(nMax); j = 0; continue; // on reboucle sur le while } j++; } // nombre unique : on l'ajoute à la liste tirage.add(i, r); } // Initialisation de l'itérateur sur la liste listIterator = tirage.iterator(); } /** * Tirage d'un nombre aléatoire * @return nombre aléatoire */ public int next() { return listIterator.next(); } /** * Détermine si tous les nombres ont été obtenu * @return vrai s'il reste un ou plusieurs nombres */ public boolean hasNext() { return listIterator.hasNext(); } /** * Réinitialise le parcours de la liste */ public void reset() { listIterator = tirage.iterator(); } public String toString() { return tirage.toString(); } // Programme de test public static void main(String[] arg) { try { // Génération d'une liste de 5 nombres aléatoires uniques [0..4] Rnd rnd = new Rnd(5, 10); // Affichage avec la méthode toString System.out.println(rnd); // Affichage en balayant la liste while (rnd.hasNext()) System.out.print(rnd.next()+ ", "); // Nouveau parcours de la liste rnd.reset(); // Nouveau tirage rnd = new Rnd(5, 10); System.out.println(); while (rnd.hasNext()) System.out.print(rnd.next()+ ", "); } catch (ExceptionParametrageErroné e) { e.printStackTrace(); } } }