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

Collection et Stream Java Discussion :

Random en Java


Sujet :

Collection et Stream Java

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 77
    Par défaut Random en Java
    Bonjour,

    J'ai un problème de random en Java.

    Voici mon code enfin simplifié :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int Nb = 10;
     
    for (int i = 0; i < Nb; i++)
    {
        Random r = new Random(); 
        int nombre = (r.nextInt(70) + 80);    
        System.out.println(nombre);
    }
    Le probleme est que r correspond à un seul et même nombre. Il me génère bien un nombre aléatoire, seulement il ne varie pas.

    Je souhaiterais obtenir 10 nombres différents.

    Quelqu'un saurait-il m'indiquer comment faire ?

    Merci d'avance pour votre aide.

  2. #2
    Membre averti
    Inscrit en
    Janvier 2007
    Messages
    56
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 56
    Par défaut
    Bonjour,

    Peut-être essaye ca (pas tester):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int[] Tab = new int[10]; 
    Random aleatoire = new Random(); 
    for(int i = 0; i < Tab.length; i++) 
    { 
        Tab = aleatoire.nextInt(Tab.length); 
        System.out.println(Tab); 
    }

  3. #3
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Il n'y a rien de réellement aléatoire en informatique, c'est pour ça qu'en pratique on appelle ça du pseudo-aléatoire.
    En fait tout dépend de la valeur d'initialisation, appelée graine : une même graine donne la même série de nombres.
    Le constructeur par défaut de Random initialise la graine toujours à la même valeur (vraissemblablement zéro), du coup lorsque tu tires un nombre tu obtiens toujours le même.

    Tu peux déjà essayer par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    int Nb= 10;
    Random r = new Random();
    for (int i=0; i<Nb;i++)
    {
        int nombre = (r.nextInt(70)+80);
        System.out.println(nombre);
    }
    Au moins chaque nombre sera différent, par contre tu auras beau lancer la série autant de fois que tu veux tu obtiendras toujours la même...
    Pour éviter ça il faut faire varier la graine, que tu peux passer à un autre constructeur de Random, en général on donne par exemple l'heure courante ou quelque chose dans le genre.

    MAT.

  4. #4
    Expert confirmé

    Profil pro
    Fabricant et casseur d'avions
    Inscrit en
    Avril 2004
    Messages
    3 817
    Détails du profil
    Informations personnelles :
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fabricant et casseur d'avions
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2004
    Messages : 3 817
    Par défaut
    Pour info, le sujet est inclus dans la FAQ Java, et il existe également un tutoriel.
    "Errare humanum est, sed perseverare diabolicum"

    Ma page sur DVP.com

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 77
    Par défaut
    Merçi beaucoup ccedced, il fallait juste déplacer le Random r = new Random() en dehors de la boucle.
    Et ça fonctionne, ça ne génère pas toujours les mêmes nombres à chaque exécution.

  6. #6
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Citation Envoyé par oldscrout
    Et ça marche nikkel, ça ne genere pas toujours les meme nombres a chaque exécution.
    Ah oui effectivement, si j'avais lu la doc j'aurais vu que l'implémentation du constructeur par défaut était :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    public Random() { this(System.currentTimeMillis()); }
    Donc si les tirages de tes séries sont espacées de plus d'une milli-seconde, c'est bon...

    MAT.

  7. #7
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,

    Citation Envoyé par Mat007
    Donc si les tirages de tes séries sont espacées de plus d'une milli-seconde, c'est bon...
    Sauf que currentTimeMillis() n'a pas forcément une précision à la milliseconde près... mais cela tourne plutôt autour des 16 ms (et cela varie selon le système).


    De toute manière il est préférable d'utiliser une seule instance de la classe Random

    a++

  8. #8
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2013
    Messages : 2
    Par défaut
    Bonjour,

    J'ai une question concernant la méthode random.

    Est-il possible de générer une valeur fixe un certain nombre de fois, par exemple 5 fois, puis générer une autre valeur ?

    Merci d'avance.

  9. #9
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    non, le but d'un tirage aléatoire (même s'il est pseudo-aléatoire), c'est de tirer un nombre différent à chaque fois (enfin le caractère aléatoire fait qu'on devrait pouvoir avoir 2 fois le même tirage de suite, mais c'est pas le problème).

    Maintenant, rien te t'empêche d'utiliser la valeur tirée plusieurs fois, donc 5 fois. Tu peux même te faire une classe qui te simule le comportement :

    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
    public class Generateur {
        private int index;
        private int nb;
        private double lastRandom;
        private Random random;
     
        public Generateur(int nb) {
           if ( nb<1 )  throw new IllegalArgumentException("nb doit être supérieur à 0");
           this.nb=nb;
           random=new Random();
        }
        public double get() {
            if ( index==0 ) {
                lastRandom=random.nextDouble();
            }
            index++;
            if ( index==nb ) {
                index=0;
            }
     
             return lastRandom;
        }
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  10. #10
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2013
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2013
    Messages : 2
    Par défaut
    merci,
    mais le problème c'est que moi je veux utiliser la méthode random dans le programme de deviner avec les interfaces.est ce que possible?

  11. #11
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par abdojava Voir le message
    le programme de deviner avec les interfaces
    Je ne comprends pas de quoi il s'agit.

    Sinon, on peut utiliser la méthode Math.random() ou la classe java.util.Random dans n'importe quel programme Java, oui.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 25/01/2011, 19h01
  2. Equivalent de random en java.
    Par MICHOUNOU dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 06/01/2009, 00h44
  3. Probleme Thread, Listener, Random Java
    Par monicaCruZ dans le forum Concurrence et multi-thread
    Réponses: 5
    Dernier message: 25/05/2007, 15h56

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