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

Langage Java Discussion :

random de Math


Sujet :

Langage Java

  1. #1
    Inactif
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 83
    Points : 43
    Points
    43
    Par défaut random de Math
    Bonjour !

    Je croyais connaître la réponse à cette question :
    La méthode Math.random() permet de générer un nombre pris au hasard entre 0 et 1.
    Cet intervalle est fermé à 0 et ouvert à 1. Vrai ou faux ?
    Mais apprement, un programme que j' ai créé a tendance à me prouver le contraire. Qu' en pensez-vous ?


    Merci d' avance pour votre réponde.

  2. #2
    Membre expérimenté
    Avatar de Manumation
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    1 153
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 153
    Points : 1 469
    Points
    1 469
    Par défaut
    Bonjour,

    Je sais pas si ça peux t'aider, mais lorsque je faisait du java, par exemple pour un nombre tiré au hasard entre 1 et 10, j'écrivais :

    i = (int) (10*Math.random()+1);

    --> Heureux est l'étudiant, qui comme la rivière, peut suivre son cours sans jamais quitter son lit...
    --> Il n'y a que dans le dictionnaire que "succès" précède "travail"...

    Pas de MP techniques, svp !

    Psst...Ici, viens voir par là...


    Des questions sur Hijackthis ?

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 116
    Points : 120
    Points
    120
    Par défaut
    Bonjour, en direct de la javadoc.

    Returns a double value with a positive sign, greater than or equal to 0.0 and less than 1.0. Returned values are chosen pseudorandomly with (approximately) uniform distribution from that range.

    Si vous avez un probleme avec votre code. Poster le

  4. #4
    Membre averti Avatar de Rayndell
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 289
    Points : 323
    Points
    323
    Par défaut
    Si ta fonction random() produit des trucs bizarres, c'est pas normal. As-tu des bouts de codes et des traces d'exécution ?
    "Et tu comprendras pourquoi mon nom est l'Eternel, quand sur toi s'abattra la colère du Tout-puissant."

  5. #5
    Inactif
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 83
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par openWorld
    Bonjour, en direct de la javadoc.

    Returns a double value with a positive sign, greater than or equal to 0.0 and less than 1.0. Returned values are chosen pseudorandomly with (approximately) uniform distribution from that range.

    Si vous avez un probleme avec votre code. Poster le
    Okay !

    >= 0 et < 1 . C' est bien ce que je pensais.

    Maintenant, comment faire pour générer des nombres entiers entre - 11 et + 11 ?

    Pas aussi facile que ça en a l' air.

  6. #6
    Membre averti
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    321
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 321
    Points : 360
    Points
    360
    Par défaut
    de -11 à 11 tu as 23 valeur possible tu vas donc avoir du
    ensuite tu veux pas commencer à 0 mais à -11 donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int nb = (int)(23*Math.random()) - 11;
    rien de compliqué

  7. #7
    Inactif
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 83
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par raph707
    Okay !

    >= 0 et < 1 . C' est bien ce que je pensais.

    Maintenant, comment faire pour générer des nombres entiers entre - 11 et + 11 ?

    Pas aussi facile que ça en a l' air.
    Finalement si ! c' est aussi facile que ça a en l' air. C' est moi qui ai mal codé. Finalement c' est mon code qui clochait.

  8. #8
    Inactif
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 83
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par leyee
    de -11 à 11 tu as 23 valeur possible tu vas donc avoir du
    ensuite tu veux pas commencer à 0 mais à -11 donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int nb = (int)(23*Math.random()) - 11;
    rien de compliqué
    Vous n' allez pas le croire, ce code ne fournit jamais le nombre - 11. J' ai essayé 62 fois déjà.

    Et vous, essayez un peu et dites moi si le nombre - 11 apparaît.

  9. #9
    Membre éclairé Avatar de remika
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    806
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 806
    Points : 861
    Points
    861
    Par défaut
    Et avec ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int nb = (int)(23*Math.random() - 11.5);
    ?
    Ignorer c'est aussi croire que l'on sait.
    Merci d'essayer d'écrire correctement.
    Pas de questions techniques par MP SVP.

  10. #10
    Inactif
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 83
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par remika
    Et avec ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int nb = (int)(23*Math.random() - 11.5);
    ?

    C' est bien beau. Mais je ne comprends toujours pas pourquoi le - 11 n' apparaît jamais.

    Math.random() renvoie un nombre compris dans l' intervalle [0.0, 1.0[

    Donc ( 23 * Math.random() )renvoie un nombre compris dans [0.0, 23.0[

    Donc ( ( 23 * Math.random() ) - 11 ) doit renvoyer un nombre compris dans [-11.0, 12.0[

    fermé à - 11.0 et (int) (-11.0) donne -11

  11. #11
    Membre averti

    Profil pro
    Inscrit en
    Mars 2007
    Messages
    392
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 392
    Points : 439
    Points
    439
    Par défaut
    Citation Envoyé par raph707
    Vous n' allez pas le croire, ce code ne fournit jamais le nombre - 11. J' ai essayé 62 fois déjà.

    Et vous, essayez un peu et dites moi si le nombre - 11 apparaît.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class T {
    	public static void main(String[] args) {
    		for (int i = 0; i <= 50; i++) {
    			int nb = (int) (23 * Math.random()) - 11;
    			if (nb == -11) {
    				System.out.println(i + ":" + nb);
    			}
    		}
    	}
    }
    résultat :
    31:-11
    45:-11

    donc, j'obtiens bien -11.

    EDIT :
    Tu peux tester avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public static void main(String[] args) {
    		int nb = 0;
    		int i = 0;
    		while (nb != -11 || i >= 1000) {
    			nb = (int) (23 * Math.random()) - 11;
    			i++;
    		}
    		System.out.println(i + ":" + nb);
    	}
    et modifier la valeur max de i.... si ça ne marche tjs pas.

  12. #12
    Membre éclairé Avatar de remika
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    806
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 806
    Points : 861
    Points
    861
    Par défaut
    Exact ça marche sans le 11.5
    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 Test {
     
        public static void main(String args[]) {
            count = new TreeMap<Integer,Integer>();
            for(int i=0;i<100;i++) {
                int nb = (int)(23*Math.random())- 11;
                put(nb);
            }
            System.out.println(count);
        }
     
        private static void put(int nb)
        {
            if(!count.keySet().contains(nb)) {
                count.put(nb,0);
                return;
            }
            count.put(nb,count.get(nb)+1);
        }
     
        private static Map<Integer,Integer> count;
    }
    Ignorer c'est aussi croire que l'on sait.
    Merci d'essayer d'écrire correctement.
    Pas de questions techniques par MP SVP.

  13. #13
    Membre averti Avatar de Rayndell
    Étudiant
    Inscrit en
    Mai 2007
    Messages
    289
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2007
    Messages : 289
    Points : 323
    Points
    323
    Par défaut
    Ce n'est pas un problème si tu n'as toujours pas obtenu -11, car c'est de l'aléatoire (ou plutôt du pseudo-aléatoire). Que tu essaie un million de fois et que tu ne l'obtiens toujours pas ne change rien au fait que tu peux l'obtenir.
    "Et tu comprendras pourquoi mon nom est l'Eternel, quand sur toi s'abattra la colère du Tout-puissant."

  14. #14
    Inactif
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 83
    Points : 43
    Points
    43
    Par défaut
    J' ai fini par comprendre mon problème. Du moins, en apparence.

    J' ai fait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int a  = (int) ( ( 23 * Math.random() ) - 11 ) ;
    au lieu de faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int a  = (int) ( 23 * Math.random() ) - 11;
    ça change tout. Maintenant, l' explication véritable, je vous l' avoue, je ne la connais pas. Mais je vais y réfléchir.

  15. #15
    Membre éclairé Avatar de remika
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    806
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 806
    Points : 861
    Points
    861
    Par défaut
    J'ai l'explication :

    Prenons Math.random() = 0.001

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int a  = (int) ( ( 23 * Math.random() ) - 11 ) ;
    0.001*23=0.023 puis -11 -> -10.977
    c'est là qu'il y a un problème : le cast en int donne -10

    tandis que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    int a  = (int) ( 23 * Math.random() ) - 11;
    0.001*23=0.023 puis cast en int -> 0 puis -11 -> -11
    Ignorer c'est aussi croire que l'on sait.
    Merci d'essayer d'écrire correctement.
    Pas de questions techniques par MP SVP.

  16. #16
    Membre averti

    Profil pro
    Inscrit en
    Mars 2007
    Messages
    392
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 392
    Points : 439
    Points
    439
    Par défaut
    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
    	public static void main(String[] args) {
    		int nb = 0;
    		int i = 0;
    		double d = 0.0;
    		while (nb != -11 && i <= 1000) {
    			d = Math.random();
    			nb = (int) (23 * d) - 11;
    			i++;
    		}
    		System.out.println((int) (23 * d) - 11);
    		System.out.println((int) (23 * d));
    		System.out.println((int) ((23 * d) - 11));
    		System.out.println(((23 * d)));
    		System.out.println(((23 * d) -11));
    		System.out.println(d);
    	}
    résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    -11
    0
    -10
    0.9102261979428199
    -10.08977380205718
    0.03957505208447043
    Dans le 1er cas, tu castes 23*0.03957505208447043... en int ce qui donne 0 puis tu enlèves 11, ce qui donne -11.
    Dans le 2nd cas, tu fais 23*0.03957505208447043 ce qui donne 0.9102261979428199... auquel tu enlèves 11, ce qui donne : -10.08977380205718 et tu castes ce nombre en int, ce qui donne -10
    Pour que ça fonctionne, il faudrait que Math.random() retourne 0.0... ce qui ne semble pas le cas, bien que la javadoc dise le contraire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	public static void main(String[] args) {
    		int i = 0;
    		double d = 1.0;
    		while (d != 0.0 && i <= 1000000) {
    			d = Math.random();
    			i++;
    		}
    		System.out.println(d + " : " + i);
    	}
    je ne sors pas de la boucle!

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    116
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 116
    Points : 120
    Points
    120
    Par défaut
    Alalalala
    Evidemment aue math.random() ne sorte pas de 0. Tu ne vois pas tous les doubles qu'elle peut sortir entre 0 et 1. Il y a une chance sur quelaues milliard de tomber sur 0.
    Mais si tu multiplie par 10. et Que tu cast en (int). Si elle te sort un nombre entre 0 et 0.1 celui ci donnera 0 multiplier par 10 et caster.
    J'espere que tu as compris. En tout cas moi je laisse tomber la dessus.
    Bonne continuation

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

Discussions similaires

  1. [Math / Random] Génération nombre aléatoire compris entre deux bornes
    Par oligig dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 30/06/2013, 17h23
  2. Réponses: 12
    Dernier message: 25/05/2007, 16h28
  3. [Math.Random] StackOverFLowError Exception
    Par michaeljeru dans le forum Langage
    Réponses: 3
    Dernier message: 27/03/2007, 22h39
  4. [FLASH MX2004] Tirage (Math.random) et égalité stricte
    Par cristolb dans le forum ActionScript 1 & ActionScript 2
    Réponses: 8
    Dernier message: 28/04/2006, 11h02
  5. [Math]Random le mystère
    Par HemPaX dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 19/12/2005, 20h58

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