Choisir des nombres aléatoires efficacement

J'ai une méthode, qui utilise des échantillons aléatoires de se rapprocher d'un calcul. Cette méthode est appelée millions de fois, donc, il est très important que le processus de choix de nombres aléatoires est efficace.

Je ne suis pas sûr de savoir comment rapide javas Random().nextInt sont vraiment, mais mon programme ne semble pas bénéficier autant que je l'aime aussi.

Au moment de choisir le nombres aléatoires, je ne les suivants: (en semi pseudo-code):

//Repeat this 300000 times
Set set = new Set();
while(set.length != 5)
    set.add(randomNumber(MIN,MAX));

Maintenant, de toute évidence, cela a un mauvais cas les pires temps d'exécution, comme l'aléatoire-fonction dans la théorie peut ajouter dupliqué numéros pour une éternité, donc rester dans la boucle pour toujours. Toutefois, les numéros sont choisis à partir de {0..45}, un double de la valeur est, pour la plupart, peu probable.

Lorsque j'utilise la méthode ci-dessus, son seul 40% plus rapide que mon autre méthode, qui ne se rapproche pas, mais donne le résultat correct. C'est couru ~ 1 millions de fois, donc je m'attendais à cette nouvelle méthode à au moins 50% plus rapide.

Avez-vous des suggestions pour une méthode plus rapide? Ou peut-être vous connaissez un moyen plus efficace de génération d'un ensemble de nombres aléatoires.

Pour clarifier, voici deux méthodes:

//Run through all combinations (1 million). This takes 5 seconds
 for(int c1 = 0; c1 < deck.length; c1++){
    for(int c2 = c1+1; c2 < deck.length; c2++){
     for(int c3 = c2+1; c3 < deck.length; c3++){
        for(int c4 = c3+1; c4 < deck.length; c4++){
         for(int c5 = c4+1; c5 < deck.length; c5++){
             enumeration(hands, cards, deck, c1, c2, c3, c4, c5);
         }
            } 
      }     
   }
   }

//Approximate (300000 combinations). This takes 3 seconds
Random rand = new Random();
HashSet<Integer> set = new HashSet<Integer>();
int[] numbers = new int[5];
while(enumerations < 300000){
set.clear();
while(set.size() != 5){
    set.add(rand.nextInt(deck.length));
}
Iterator<Integer> i = set.iterator();
int n = 0;
while(i.hasNext()){
    numbers[n] = i.next();
    n++;
}

Après quelques tests et le profilage, j'ai trouvé que cette méthode soit la plus efficace:

Random rand = new Random();
int[] numbers = new int[5];
ArrayList<Integer> list = new ArrayList<Integer>();
while(enumerations < 300000){
 while(list.size() != 5) {
     int i = rand.nextInt(deck.length);
        if(!list.contains(i)) list.add(i);
 }
 int index = 0;
 for(int i : list){ numbers[index] = i; index++; }
 enumeration(hands, cards, deck,numbers);
}

source d'informationauteur