IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

générateur aléatoire d'entiers entre 2 bornes, les nombres générés sont des séries identiques !


Sujet :

avec Java

  1. #1
    Membre confirmé Avatar de ben.IT
    Homme Profil pro
    Inscrit en
    Janvier 2009
    Messages
    431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 431
    Points : 486
    Points
    486
    Par défaut générateur aléatoire d'entiers entre 2 bornes, les nombres générés sont des séries identiques !
    Bonjour, je souhaite générer des entiers aléatoirement entre un min et un max.
    Pour cela, j'utilise la fonction nextInt de la classe Random.
    Cette fonction génère des entiers entre 0 et le max passé en paramètre. Or je souhaiterai générer des entiers entre un min et un max passés en paramètres.

    Le principe de ma fonction est le suivant : tant que le nombre généré entre 0 et le max par nextInt est inférieur au min, on regénère un nouveau nombre aléatoire :

    voici le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    public class Test_aleatoire_method {
     
    	/*methode générant des nombres entiers aleatoires entre les bornes passées en paramètres
    	 * @ param min, max
    	 * @return alea, le nombre aleatoire généré
    	 */
    	public static int gen_aleat_born (int min, int max) {
    		int alea;
    		Random rando = new Random();
    		alea=rando.nextInt(max);
     
    		while (alea<min){
    			alea=rando.nextInt(max);
    		}
     
    		return alea ;
    	}
     
    	public static void main(String[] args)
    	{
     
     
     
    	int min, max, nb, i;
     
    	System.out.print("saisir la borne min de l'intervalle : ");
    	min=Clavier.readInt ();
    	System.out.println("------------------");
     
    	System.out.print("saisir la borne max de l'intervalle : ");
    	max=Clavier.readInt ();
    	System.out.println("------------------");
     
    	System.out.print("saisir le nombre de valeurs à génerer : ");
    	nb=Clavier.readInt ();
    	System.out.println("------------------");
     
    	for (i=1;i<=nb;i++){
    		System.out.println("valeur # " + i + " : " + gen_aleat_born(min,max));
    	}
     
    	}
    }
    voici les résultats :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    saisir la borne min de l'intervalle : 10
    ------------------
    saisir la borne max de l'intervalle : 20
    ------------------
    saisir le nombre de valeurs à génerer : 500
    ------------------
    valeur # 1 : 12
    valeur # 2 : 12
    valeur # 3 : 12
    valeur # 4 : 12
    valeur # 5 : 12
    valeur # 6 : 12
    valeur # 7 : 12
    valeur # 8 : 12
    valeur # 9 : 11
    valeur # 10 : 11
    valeur # 11 : 11
    valeur # 12 : 11
    valeur # 13 : 11
    valeur # 14 : 11
    valeur # 15 : 11
    valeur # 16 : 11
    valeur # 17 : 11
    valeur # 18 : 11
    valeur # 19 : 11
    valeur # 20 : 11
    valeur # 21 : 11
    valeur # 22 : 11
    valeur # 23 : 15
    valeur # 24 : 15
    valeur # 25 : 15
    valeur # 26 : 15
    valeur # 27 : 15
    valeur # 28 : 15
    valeur # 29 : 15
    valeur # 30 : 15
    valeur # 31 : 15
    valeur # 32 : 15
    valeur # 33 : 15
    valeur # 34 : 15
    valeur # 35 : 15
    valeur # 36 : 15
    valeur # 37 : 15
    valeur # 38 : 18
    valeur # 39 : 18
    Comme vous pouvez le voir les nombres générés se suivent, comment faire pour obtenir des nombres générés aléatoirement entre un min et un max ??

  2. #2
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Points : 2 161
    Points
    2 161
    Par défaut
    salut,

    le problème est que la génération de nombres aléatoires n'exise pas pour un ordinateur. On parle de génération pseudo-aléatoire.

    Le générateur se base sur une valeur de départ appelée 'graine' ('seed' en anglais). Si ladite graine est identique entre deux appels, les nombres générés seront strictement identiques en sortie.

    Le constructeur de la classe Random sans paramètres est censé créer une instance de Random avec une graine plus ou moins distincte à chaque fois.... mais ne garantit rien.

    This constructor sets the seed of the random number generator to a value very likely to be distinct from any other invocation of this constructor.
    A toi donc de te débrouiller pour fournir à chaque génération d'un nouveau random une graine différente de la précédente.

    Plusieurs solutions:

    - utiliser comme graine System.nanoTime() qui a de très fortes chances de varier d'un appel à l'autre, même en cas d'appels très rapprochés.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Random rando = new Random(System.nanoTime());
    - utiliser comme graine une valeur entière statique que tu incrémenteras à chaque nouvelle génération d'une instance de Random:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
            private static long seed = 0;
    
    	public static int gen_aleat_born (int min, int max) {
    		int alea;
    		Random rando = new Random(seed ++);
    		alea=rando.nextInt(max);
    		
    		while (alea<min){
    			alea=rando.nextInt(max);
    		}
    		
    		return alea ;
    	}
    - encore mieux: n'instancier qu'une fois pour toutes ton objet Random dont tu te serviras à chaque fois:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
            private static Random rando = new Random();
    
    	public static int gen_aleat_born (int min, int max) {
    		int alea = rando.nextInt(max);
    		while (alea<min){
    			alea=rando.nextInt(max);
    		}
    		
    		return alea ;
    	}
    Dernière chose: il y a une façon plus simple pour récupérer une valeur aléatoire entre min et max, c'est de demander une valeur entre zéro et (max-min) puis d'ajouter 'min'

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int alea = new Random().nextInt(max-min+1) + min;
    Mon projet du moment: BounceBox, un jeu multijoueurs sur Freebox, sur PC et depuis peu sur smartphone/tablette Android.

  3. #3
    Membre expérimenté
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 050
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 050
    Points : 1 340
    Points
    1 340
    Par défaut
    Salut,

    la borne maximale est déterminée par la méthode nextInt.
    Une addition suffit pour déterminer la borne minimale.

    Pour min et max inclus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    private Random rnd = new Random();
     
    public int random(int min, int max) {
    	return this.rnd.nextInt(max + 1) + min;
    }

  4. #4
    Modérateur
    Avatar de nouknouk
    Homme Profil pro
    Inscrit en
    Décembre 2006
    Messages
    1 655
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 1 655
    Points : 2 161
    Points
    2 161
    Par défaut
    Citation Envoyé par visiwi Voir le message
    return this.rnd.nextInt(max + 1) + min;
    je pense que c'est plutôt (max-min+1), car avec par exemple (min = 10 et max = 15), nextInt(max+1) peut très bien te retourner 14, et 14 + 10 te donneront 24, ce qui est au-delà du max initial (15).
    Mon projet du moment: BounceBox, un jeu multijoueurs sur Freebox, sur PC et depuis peu sur smartphone/tablette Android.

  5. #5
    Membre expérimenté
    Avatar de visiwi
    Profil pro
    Inscrit en
    Février 2008
    Messages
    1 050
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 1 050
    Points : 1 340
    Points
    1 340
    Par défaut
    Citation Envoyé par nouknouk Voir le message
    je pense que c'est plutôt (max-min+1), car avec par exemple (min = 10 et max = 15), nextInt(max+1) peut très bien te retourner 14, et 14 + 10 te donneront 24, ce qui est au-delà du max initial (15).
    Oui, tout à fait, écriture un peut hâtive de mon côté, vous aurez rectifié mon erreur.

  6. #6
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Autre solution : utiliser Math.random() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	public static int random (int min, int max) {
    		return min + (int) ( Math.random() * (max - min) );
    	}
    a++

  7. #7
    Membre confirmé Avatar de ben.IT
    Homme Profil pro
    Inscrit en
    Janvier 2009
    Messages
    431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 431
    Points : 486
    Points
    486
    Par défaut
    Bonjour à tous et merci de vos réponses. j'ai trouvé une solution simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public static int aleat_borne(int min, int max, Random rando) {
    	int alea;
    	alea = rando.nextInt(max-min+1);
    	alea+=min;
     
    	return alea;
     
    }
    qui marche bien

    merci à tous, à bientôt.
    benilto

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/04/2015, 06h45
  2. Réponses: 78
    Dernier message: 30/09/2010, 12h02
  3. Réponses: 9
    Dernier message: 26/04/2007, 13h53
  4. jointures dont les 2 membres sont des select
    Par rémi_tounul dans le forum Autres SGBD
    Réponses: 4
    Dernier message: 26/04/2005, 14h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo