[LJ1]TD6 Random

Voir le sujet précédent Voir le sujet suivant Aller en bas

[LJ1]TD6 Random

Message  Bling le Jeu 05 Nov 2009, 00:08

J'essaye d'utiliser une méthode Random pour me retourner un nombre entre 1 et 6. Le problème c'est que j'arrive à me retourner un entier ou un double entre 0 et 6 mais je ne vois pas comment faire pour partir de 1...

Bling

Nombre de messages : 32
Age : 28
Prénom : David
Date d'inscription : 23/09/2009

Revenir en haut Aller en bas

Re: [LJ1]TD6 Random

Message  pbt le Jeu 05 Nov 2009, 00:31

... en faisant "+1" ?




_________________
smartq.namok.be · faq ·  · IRC / irc.freenode.net #esi · blog.namok.be
style #pbt {heigth:189cm; weight:79kg; eye-color:#524000; hair:very short; dead pixels: some; }

pbt
Admin

Nombre de messages : 4862
Age : 45
Prénom : Pierre
Statut : prof
Localisation : La cité des géants
Date d'inscription : 24/11/2005

http://esi.namok.be

Revenir en haut Aller en bas

Re: [LJ1]TD6 Random

Message  Abdel le Jeu 05 Nov 2009, 09:45

La fonction te renvoi un double ce qu'il te reste à faire c'est le transformer en int -->Cast

Pour ce qui est de partir de 1 c'est à toi de mettre des bornes...

Ex : pour un nombre compris entre 1 et 5 tu nb(nombre reçu par la fonction ) * 5 que tu cast en int =)

Bon travail bounce

Abdel

Nombre de messages : 13
Age : 27
Prénom : Abdel
Statut : Ancien( Diplômé en 2011 )
Localisation : Namur
Date d'inscription : 04/12/2008

Revenir en haut Aller en bas

Re: [LJ1]TD6 Random

Message  Wark le Jeu 05 Nov 2009, 10:04

Abdel a écrit:La fonction te renvoi un double ce qu'il te reste à faire c'est le transformer en int -->Cast

Pour ce qui est de partir de 1 c'est à toi de mettre des bornes...

Ex : pour un nombre compris entre 1 et 5 tu nb(nombre reçu par la fonction ) * 5 que tu cast en int =)

Bon travail bounce

Tu vas avoir un nombre entre 0 et 4 là.

Math.random() renvoie un double compris dans l'intervalle : 0 <= random() < 1. En multipliant et castant, tu n'obtiens jamais 5.

Pour un nombre entre 1 et 5 :

Code:
((int)(Math.random()*5))+1

Pour un nombre entre x (plus petit) et y (plus grand) :

Code:
((int)(Math.random()*(y-x))+x

Wark

Nombre de messages : 682
Age : 29
Prénom : Cédric
Statut : Diplômé 2010
Localisation : Braine l'alleud
Date d'inscription : 04/02/2008

Revenir en haut Aller en bas

Re: [LJ1]TD6 Random

Message  nvs le Jeu 05 Nov 2009, 10:19

n'est-il pas plus simple, et mathématiquement plus correct, d'utiliser la classe java.util.Random et sa méthode nextInt(int) ?








_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

Re: [LJ1]TD6 Random

Message  Wark le Jeu 05 Nov 2009, 10:23

nvs a écrit:n'est-il pas plus simple, et mathématiquement plus correct, d'utiliser la classe java.util.Random et sa méthode nextInt(int) ?








Moi, j'aime bien Math.random() Razz

Wark

Nombre de messages : 682
Age : 29
Prénom : Cédric
Statut : Diplômé 2010
Localisation : Braine l'alleud
Date d'inscription : 04/02/2008

Revenir en haut Aller en bas

Re: [LJ1]TD6 Random

Message  Abdel le Jeu 05 Nov 2009, 10:41

Wark a écrit:
Abdel a écrit:La fonction te renvoi un double ce qu'il te reste à faire c'est le transformer en int -->Cast

Pour ce qui est de partir de 1 c'est à toi de mettre des bornes...

Ex : pour un nombre compris entre 1 et 5 tu nb(nombre reçu par la fonction ) * 5 que tu cast en int =)

Bon travail bounce

Tu vas avoir un nombre entre 0 et 4 là.

Math.random() renvoie un double compris dans l'intervalle : 0 <= random() < 1. En multipliant et castant, tu n'obtiens jamais 5.

Pour un nombre entre 1 et 5 :

Code:
((int)(Math.random()*5))+1

Pour un nombre entre x (plus petit) et y (plus grand) :

Code:
((int)(Math.random()*(y-x))+x

En effet le "+1" ^^

Dur dur de se lever un matin de congé Very Happy

Abdel

Nombre de messages : 13
Age : 27
Prénom : Abdel
Statut : Ancien( Diplômé en 2011 )
Localisation : Namur
Date d'inscription : 04/12/2008

Revenir en haut Aller en bas

Re: [LJ1]TD6 Random

Message  nvs le Jeu 05 Nov 2009, 10:46

Wark a écrit:Moi, j'aime bien Math.random() Razz
pour générer un double (pseudo-)aléatoire entre 0 et 1, ok, mais pour un entier entre n et m, mathématiquement, ça ne tient pas la route Smile








_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

Re: [LJ1]TD6 Random

Message  Wark le Jeu 05 Nov 2009, 10:56

nvs a écrit:pour générer un double (pseudo-)aléatoire entre 0 et 1, ok, mais pour un entier entre n et m, mathématiquement, ça ne tient pas la route Smile








L'informaticien est fainéant.. je pense en devenir un bon .. si possible !

Maintenant, c'est certain que votre point de vue est le plus logique... Moi, tant que ça marche... Very Happy

Wark

Nombre de messages : 682
Age : 29
Prénom : Cédric
Statut : Diplômé 2010
Localisation : Braine l'alleud
Date d'inscription : 04/02/2008

Revenir en haut Aller en bas

Re: [LJ1]TD6 Random

Message  Bling le Jeu 05 Nov 2009, 11:17

Code:
int randomNumber = new Random().nextInt(6)+1;
Voilà j'ai fait comme ça et ça marche bien. Ca me semble un peu tordu quand même, si on pouvait juste donner un min et un max ce serrait plus simple :p.

Bling

Nombre de messages : 32
Age : 28
Prénom : David
Date d'inscription : 23/09/2009

Revenir en haut Aller en bas

Re: [LJ1]TD6 Random

Message  nvs le Jeu 05 Nov 2009, 11:23

Bling a écrit:
Code:
int randomNumber = new Random().nextInt(6)+1;
Voilà j'ai fait comme ça et ça marche bien. Ca me semble un peu tordu quand même, si on pouvait juste donner un min et un max ce serrait plus simple :p.
le max est explicitement fourni (le plus grand entier < 6, ici), quant au min, c'est toujours zéro Smile

@Wark : la ligne de code proposée par Bling est correcte et ne me semble pas beaucoup plus fatigante à encoder et à comprendre que le brol que tu proposes Wink









_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

Re: [LJ1]TD6 Random

Message  Wark le Jeu 05 Nov 2009, 11:25

nvs a écrit:
@Wark : la ligne de code proposée par Bling est correcte et ne me semble pas beaucoup plus fatigante à encoder et à comprendre que le brol que tu proposes Wink

C'est certain.. mais je n'ai jamais farfouillé plus que cela pour avoir un nombre aléatoire en Java. Maintenant, je sais que, comme toujours, pour arriver à la même chose, on peut utiliser plusieurs techniques. ^^

Wark

Nombre de messages : 682
Age : 29
Prénom : Cédric
Statut : Diplômé 2010
Localisation : Braine l'alleud
Date d'inscription : 04/02/2008

Revenir en haut Aller en bas

Re: [LJ1]TD6 Random

Message  nvs le Jeu 05 Nov 2009, 11:31

Wark a écrit:Maintenant, je sais que, comme toujours, pour arriver à la même chose, on peut utiliser plusieurs techniques. ^^
sauf que tu n'arrives pas à la même chose : ta méthode génère des nombres moins aléatoires (en ce sens que les entiers de l'intervalle ont moins la même probabilité de « sortir ») que celle de Bling.

ce que fait Bling est davantage correct, élégant et lisible, tout en étant concis.






_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

Re: [LJ1]TD6 Random

Message  mcd le Jeu 05 Nov 2009, 12:13

Au début, on n'avait pas encore vu les objets -> Math.random() dont l'écriture leur est plus compréhensible.
Par contre, je n'ai jamais trouvé de source expliquant pourquoi c'est moins "aléatoire" que le nextInt().
Intuitivement, ça me semble kif-kif.
Quelqu'un a un lien l'expliquant ?

mcd

Nombre de messages : 1548
Prénom : Marco
Statut : prof
Localisation : Molenbeek
Date d'inscription : 29/09/2006

http://mcd.namok.be

Revenir en haut Aller en bas

Re: [LJ1]TD6 Random

Message  nvs le Jeu 05 Nov 2009, 14:25

un début d'explication dans les javadoc de java.util.Random.nextDouble, java.util.Random.nextInt(int) et de java.util.Random.next. Cette dernière méthode est utilisée par toutes les autres méthodes de java générant un nombre aléatoire et est basée sur un algorithme de The Art of Computer Programming de Donald Knuth (Volume 3, Section 3.2.1.). pour ce qui me concerne, ça mérite également des éclaircissements, mais il me semble que si c'était kif-kif, les développeurs de java auraient implémenté nextInt(int) plus simplement Wink









_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

Re: [LJ1]TD6 Random

Message  Wark le Jeu 05 Nov 2009, 14:48

Et voilà encore une de mes réponses qui suscite polémique (gentille néanmoins) Embarassed Razz

Wark

Nombre de messages : 682
Age : 29
Prénom : Cédric
Statut : Diplômé 2010
Localisation : Braine l'alleud
Date d'inscription : 04/02/2008

Revenir en haut Aller en bas

Re: [LJ1]TD6 Random

Message  mcd le Jeu 05 Nov 2009, 17:39

Je n'ai jamais bcp investigé les algorithmes de génération de nombres aléatoires.
Le code de Math.random() est
Code:
  682      private static Random randomNumberGenerator;
  683 
  684      private static synchronized void initRNG() {
  685          if (randomNumberGenerator == null)
  686              randomNumberGenerator = new Random();
  687      }
[...]
  710      public static double random() {
  711          if (randomNumberGenerator == null) initRNG();
  712          return randomNumberGenerator.nextDouble();
  713      }
Il utilise la classe Random() pour générer les doubles.
A voir si générer des doubles et puis arrondir est aussi aléatoire que de demander directement un entier...

mcd

Nombre de messages : 1548
Prénom : Marco
Statut : prof
Localisation : Molenbeek
Date d'inscription : 29/09/2006

http://mcd.namok.be

Revenir en haut Aller en bas

Re: [LJ1]TD6 Random

Message  nvs le Jeu 05 Nov 2009, 19:31

Wark a écrit:Et voilà encore une de mes réponses qui suscite polémique (gentille néanmoins) Embarassed Razz
aucune polémique. j'ai l'impression que tout le monde est d'accord sur le fait que pour générer une séquence pseudo-aléatoire d'entiers il vaut mieux utiliser les méthodes nextInt avec ou sans argument que passer par un double manipulé puis transtypé. y'a juste que personne ne sait pourquoi... Laughing











Dernière édition par nvs le Jeu 05 Nov 2009, 19:53, édité 1 fois

_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

Re: [LJ1]TD6 Random

Message  nvs le Jeu 05 Nov 2009, 19:34

mcd a écrit:Je n'ai jamais bcp investigé les algorithmes de génération de nombres aléatoires.
Le code de Math.random() est
Code:
  682      private static Random randomNumberGenerator;
  683 
  684      private static synchronized void initRNG() {
  685          if (randomNumberGenerator == null)
  686              randomNumberGenerator = new Random();
  687      }
[...]
  710      public static double random() {
  711          if (randomNumberGenerator == null) initRNG();
  712          return randomNumberGenerator.nextDouble();
  713      }
Il utilise la classe Random() pour générer les doubles.
A voir si générer des doubles et puis arrondir est aussi aléatoire que de demander directement un entier...
comme je l'ai déjà signalé, toutes les méthodes java qui génèrent des séquences pseudo-aléatoire utilisent java.util.Random.next. c'est dans cette méthode et son usage (argument, transtypage) que réside, amha, la réponse...






_________________

nvs

Nombre de messages : 5238
Age : 44
Prénom : Nicolas
Statut : prof
Localisation : bxl
Date d'inscription : 24/11/2005

http://nvansteenkiste.googlepages.com

Revenir en haut Aller en bas

Re: [LJ1]TD6 Random

Message  Contenu sponsorisé Aujourd'hui à 14:44


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum