98 votes

Génération de nombres aléatoires uniques en Java

J'essaie d'obtenir des nombres aléatoires compris entre 0 et 100. Mais je veux qu'ils soient uniques, et non répétés dans une séquence. Par exemple, si j'obtiens 5 numéros, ils doivent être 82,12,53,64,32 et non 82,12,53,12,32. J'ai utilisé ceci, mais cela génère les mêmes nombres dans une séquence.

Random rand = new Random();
selected = rand.nextInt(100);

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 premier n éléments.

0 votes

0 votes

0voto

Tony Nassar Points 21

Ce n'est pas très différent des autres réponses, mais je voulais le tableau d'entiers à la fin :

    Integer[] indices = new Integer[n];
    Arrays.setAll(indices, i -> i);
    Collections.shuffle(Arrays.asList(indices));
    return Arrays.stream(indices).mapToInt(Integer::intValue).toArray();

0voto

Sachin Rane Points 56

Vous pouvez utiliser un tableau booléen pour remplir la case true if value taken else set naviguer à travers le tableau booléen pour obtenir la valeur comme indiqué ci-dessous

package study;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/*
Created By Sachin  Rane on Jul 18, 2018
*/
public class UniqueRandomNumber {
    static Boolean[] boolArray;
    public static void main(String s[]){
        List<Integer> integers = new ArrayList<>();

        for (int i = 0; i < 10; i++) {
            integers.add(i);
        }

        //get unique random numbers
        boolArray = new Boolean[integers.size()+1];
        Arrays.fill(boolArray, false);
        for (int i = 0; i < 10; i++) {
            System.out.print(getUniqueRandomNumber(integers) + " ");

        }

    }

    private static int  getUniqueRandomNumber(List<Integer> integers) {
        int randNum =(int) (Math.random()*integers.size());
        if(boolArray[randNum]){
            while(boolArray[randNum]){
                randNum++;
                if(randNum>boolArray.length){
                    randNum=0;
                }
            }
            boolArray[randNum]=true;
            return randNum;
        }else {
            boolArray[randNum]=true;
            return randNum;
        }

    }

}

0voto

Vous pouvez utiliser la classe Collections.

Une classe utilitaire appelée Collections offre différentes actions qui peuvent être exécutées sur une collection comme une ArrayList (par exemple, rechercher les éléments, trouver l'élément maximum ou minimum, inverser l'ordre des éléments, et ainsi de suite). L'une des actions qu'il peut effectuer consiste à mélanger les éléments. Le brassage déplace aléatoirement chaque élément à une position différente dans la liste. Pour ce faire, il utilise un objet aléatoire. Cela signifie qu'il s'agit d'un aléa déterministe, mais cela convient dans la plupart des situations.

Pour mélanger la liste de tableaux, ajoutez l'importation Collections en haut du programme, puis utilisez la méthode statique Shuffle. Elle prend la liste de tableaux à mélanger comme paramètre :

import java.util.Collections;
import java.util.ArrayList;
public class Lottery {
public static void main(String[] args) {
//define ArrayList to hold Integer objects
ArrayList numbers = new ArrayList();
for(int i = 0; i < 100; i++)
{
numbers.add(i+1);
}
Collections.shuffle(numbers);
System.out.println(numbers);
}
}

-1voto

Baliram Gupta Points 1

Vous pouvez générer n nombres aléatoires uniques entre 0 et n-1 en java.

public static void RandomGenerate(int n)
{
     Set<Integer> st=new HashSet<Integer>();
     Random r=new Random();
     while(st.size()<n)
     {
        st.add(r.nextInt(n));
     }

}

-1voto

C'est le le plus simple méthode permettant de générer des valeurs aléatoires uniques dans une plage ou à partir d'un tableau .

Dans cet exemple, je vais utiliser un tableau prédéfini, mais vous pouvez également adapter cette méthode pour générer des nombres aléatoires. Tout d'abord, nous allons créer un tableau type pour récupérer nos données.

  1. Générer un nombre aléatoire et l'ajouter au nouveau tableau.
  2. Générer un autre nombre aléatoire et vérifier s'il est déjà stocké dans le nouveau tableau.
  3. Si ce n'est pas le cas, ajoutez-le et continuez
  4. sinon réitérer l'étape.

    ArrayList<Integer> sampleList = new ArrayList<>(); sampleList.add(1); sampleList.add(2); sampleList.add(3); sampleList.add(4); sampleList.add(5); sampleList.add(6); sampleList.add(7); sampleList.add(8);

Maintenant, de la sampleList nous produirons cinq nombres aléatoires qui sont uniques.

int n;
randomList = new ArrayList<>();
for(int  i=0;i<5;i++){
    Random random = new Random();
    n=random.nextInt(8);     //Generate a random index between 0-7

    if(!randomList.contains(sampleList.get(n)))
    randomList.add(sampleList.get(n));
    else
        i--;    //reiterating the step
}

C'est conceptuellement très simple. Si la valeur aléatoire générée existe déjà, nous répéterons l'étape. Nous continuerons ainsi jusqu'à ce que toutes les valeurs générées soient uniques.

Si vous avez trouvé cette réponse utile, vous pouvez voter pour elle car elle est beaucoup plus simple dans son concept que les autres réponses. .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X