Générer un nombre aléatoire différents des nombres existants [Résolu/Fermé]

Signaler
Messages postés
63
Date d'inscription
mardi 4 juin 2013
Statut
Membre
Dernière intervention
6 février 2016
-
Messages postés
63
Date d'inscription
mardi 4 juin 2013
Statut
Membre
Dernière intervention
6 février 2016
-
Bonjour,

J'ai un tableau de int de taille 10 (ces éléments sont bornés entre 1 et 10) . Dans ce tableaux il y a les valeurs 2, 5 , 7
Je veux créer un nombre entier aléatoire entre 1 et 10 mais il doit être différent des éléments qui existe déjà dans le tableau (ça veut dire que le nombre généré doit être soit 1 ou 3 ou 4 ou 6 ou 8 ou 9 ou 10) .

J'ai la formule pour créer un nombre aléatoire, il me reste une idée pour faire la condition :
int higher = 10, lower = 1;
int random = (int)(Math.random() * (higher-lower)) + lower;

Vous avez des idées ? merci

3 réponses

Messages postés
171
Date d'inscription
dimanche 8 juillet 2012
Statut
Membre
Dernière intervention
21 mars 2015
24
Bonjour,

public class un {

public static void main(String[] args)
{
int taille;
int array[] = {0,2,5,7,11};
taille = (array.length);
int tab[] = new int[taille];
for(int i = 0; i < taille-1; i++)
{
int higher = array[i+1], lower = array[i]+1;
int random = (int)(Math.random() * (higher-lower)) + lower;
tab[i]= random;
}
int nbAlea = (int)(Math.random()*taille);
int resultat = tab[nbAlea];
if (resultat == 0) resultat++;
System.out.println(resultat);
}
}

Normalement ça marche !
Messages postés
16152
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
15 janvier 2021
2 769
Bonjour,

Tu peux utiliser un Set en parallèle de ton tableau. Quand tu utilises la méthode add, ça renvoie true si l'ensemble a été modifié ou false si la valeur ajoutée existait déjà.

Exemple : je rempli aléatoirement un tableau avec des valeurs différentes.

public static void main(String...args)
{
    int lower = 1, higher = 10;
    int[] tab = new int[5];
    
    HashSet<Integer> set = new HashSet<Integer>(tab.length);
    
    for (int i = 0; i < tab.length; i++ )
    {
        int random;
        do
        {
            random = (int) (Math.random() * (higher - lower)) + lower;
        }
        while ( !set.add(random));
        
        tab[i] = random;
    }
    
    System.out.println(Arrays.toString(tab));
}

Remarque : pour éviter le passage inutile vers un nombre aléatoire double pour le repasser en int avec ta formule
(int) (Math.random() * (higher - lower)) + lower;
on peut générer directement des entiers aléatoires avec la classe Random.

private static final Random RANDOM = new Random();

int random = RANDOM.nextInt(higher-lower) + lower;
Messages postés
63
Date d'inscription
mardi 4 juin 2013
Statut
Membre
Dernière intervention
6 février 2016
1
Bonjour,

Je vous remercie pour votre aide précieux, je vous laisse ce que j'ai fait et ça marche pour moi.

package sdfsdf;



/**
* @author Youness Mourtaji
*
*/
public class un {

public static void main(String[] args)
{
String [] delivriesReferences = {"v1.1","v1.20","v1.30","v1.56","v1.123","v1.147","v1.201","v1.253"};
String random = myVersion(1,260);
System.out.println("random : " + random);
}
public static String myVersion(int lower, int higher) {
int random = (int)(Math.random() * (higher-lower)) + lower;
int i=0;
String version = null;
version = toString1(random);
String [] delivriesReferences = {"v1.1","v1.20","v1.30","v1.56","v1.123","v1.147","v1.201","v1.253"};
int taille = delivriesReferences.length;

for(int j=0; j<taille; j++)
{
if (version==delivriesReferences[j])
{

int max = Integer.valueOf(delivriesReferences[j+1]).intValue();
int min = Integer.valueOf(delivriesReferences[j]+1).intValue();
random = (int)(Math.random() * (max-min)) + min;
version = toString1(random);
}
}


return version;
}

//méthode de concaténation des chaines de caractéres
public static String toString1(int version)
{
final StringBuilder builder = new StringBuilder();
builder.append("v1.").append(version);
return builder.toString();
}
}