Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide Recherche
1732 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Nombres aléatoires.

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Nombres aléatoires.

n°1670571
Sakayapo
Posté le 14-01-2008 à 02:49:03  profilanswer
 

Bonjour,  
 
J'aimerais obtenir une information spécifique.
 
Le problème est le suivant: Il faut obtenir des nombres aléatoires compris entre 1 et 998.
Ça va pour l'utilisation de Math random et la boucle for. Mais seulement, lorsque les nombres aléatoires s'affichent, ils ne sont pas tous différents.  
 
J'ai entendu parler de l'utilisation d'un tableau, seulement son utilisation me semble obscur.
 
Comment pourais-je obtenir des nombres aléatoires tous différents?    
 
 
 
 
 
 
 
[quote]The ways of the future.

mood
Publicité
Posté le 14-01-2008 à 02:49:03  profilanswer
 

n°1670629
capitainei​gloo
Posté le 14-01-2008 à 10:36:06  profilanswer
 

Sakayapo a écrit :

Mais seulement, lorsque les nombres aléatoires s'affichent, ils ne sont pas tous différents.  


 
c'est normal, aléatoire ne signifie pas exclusif

n°1670645
Taz
bisounours-codeur
Posté le 14-01-2008 à 10:54:38  profilanswer
 

java.util.Random.nextInt

n°1671243
BifaceMcLe​OD
The HighGlandeur
Posté le 15-01-2008 à 00:16:13  profilanswer
 

Petite histoire : un prof d'info a demandé un jour à sa centaine d'étudiants de lui rendre, au début de cours suivant, une feuille blanche avec 10 tirages de dés au recto, et le nom de l'étudiant au verso. Il a ajouté que la première moitié de la salle (dans la liste alphabétique) devait faire réellement les 10 tirages de dés, et que la deuxième moitié de simuler à la main (par son cerveau) les tirages de dés. Le professeur prétendait être capable de déterminer quels tirages étaient des vrais tirages, et quels tirages étaient simulés, avec au moins 95% de réussite (le nom au verso permettant simplement de vérifier ou d'invalider a posteriori sa prédiction). Les étudiants, titillés, se sont pris au jeu.
Au début du cours suivant, le professeur a ramassé les feuilles, et, d'un simple coup d'oeil sur chacune d'entre elles, a essayé de deviner les vrais tirages de dés des faux. Les étudiants furent bluffés : son taux de réussite tournait autour de 97 %.
 
Comment a-t-il fait ? "Très simple," a-t-il ajouté. "Quand vous tirez 10 fois un dé, la probabilité que vous tiriez, au moins une fois, le même nombre 2 fois de suite est assez élevée. J'ai simplement dit "faux tirage" lorsque sur la feuille, il n'y avait jamais 2 fois de suite le même nombre, et "vrai tirage" dans l'autre cas." Inutile de dire que les étudiants furent deux fois bluffés.

n°1671385
charly007
Posté le 15-01-2008 à 11:42:08  profilanswer
 

Quelle belle histoire :D
 
C'est le principe des tirages indépendants.
 
La probabilité d'obtenir
1-1-1-1-1-1-1-1-1-1
 
est égale à celle d'obtenir n'importe quelle autre combinaison, par ex :
4-2-3-5-1-6-4-5-2-3
 
Les sciences sociales dans la logique du tapis vert :
http://www.ac-orleans-tours.fr/ses [...] s_vert.htm

Message cité 1 fois
Message édité par charly007 le 15-01-2008 à 11:56:18
n°1671391
kadreg
profil: Utilisateur
Posté le 15-01-2008 à 12:02:50  profilanswer
 

charly007 a écrit :

C'est le principe des tirages indépendants.


 
aussi appellée "un dé n'a pas de mémoire "


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
n°1671583
seagull6
Posté le 15-01-2008 à 16:15:24  profilanswer
 

Je connais ça sous "excel"

n°1673481
Sakayapo
Posté le 18-01-2008 à 16:09:54  profilanswer
 

seagull6 a écrit :

Je connais ça sous "excel"


 
Hum.. intéressant!
Mais n'oublis pas que j'aimerais en savoir d'avantage sur les nombres aléatoires se répétant qu'une seule fois!

n°1673486
brisssou
8-/
Posté le 18-01-2008 à 16:19:00  profilanswer
 

il faut que tu gardes une trace des nombres que tu as déjà eu, et si le nouveau nombre est déjà sorti, tu fais un nouveau tirage. qu'est-ce que t'endive ?


---------------
HFR - Mes sujets pour Chrom(e/ium) - vérifie les mises à jour des topics suivis/favoris // Extension Chrome pour voter sur La Grosse Radio
n°1673676
Sakayapo
Posté le 19-01-2008 à 02:46:34  profilanswer
 

brisssou a écrit :

il faut que tu gardes une trace des nombres que tu as déjà eu, et si le nouveau nombre est déjà sorti, tu fais un nouveau tirage. qu'est-ce que t'endive ?


 
 
 :pfff: En réinitialisant une, deux, ou plusieurs fois les nombres aléatoires, il y a toujours un minimum de deux valeurs identiques!

mood
Publicité
Posté le 19-01-2008 à 02:46:34  profilanswer
 

n°1673696
brisssou
8-/
Posté le 19-01-2008 à 08:43:34  profilanswer
 

et donc ?


---------------
HFR - Mes sujets pour Chrom(e/ium) - vérifie les mises à jour des topics suivis/favoris // Extension Chrome pour voter sur La Grosse Radio
n°1673766
leo++
Chef de file indienne
Posté le 19-01-2008 à 14:43:06  profilanswer
 

Sakayapo a écrit :


 
 
 :pfff: En réinitialisant une, deux, ou plusieurs fois les nombres aléatoires, il y a toujours un minimum de deux valeurs identiques!


 
Nan mais ca c'est normal, tu as juste reinitialisé la graine (seed en anglais), pour obtenir des tirages aléatoires et tous différents, il n'y a pas de solution toute faite. La manière la plus simple c'est d'enregistrer tous les résultats que tu as eu et de vérifier à chaque fois que le nombre tiré ne s'y situe pas.
 
Tu remarqueras par toi même que cette méthode est assez lourde puisque pour le dernier résultat, avec 997 nombres déja tirés, tu devras faire quelque chose comme 1000 itérations pour obtenir le nombre attendu (qui est déductible de manière simple, pourtant). En plus le nombre d'itérations n'est pas limité ce qui veut dire que tu peux (ca n'arrivera jamais, la probabilité est trop faible) bloquer ton programme à jamais s'il ne tire jamais un numéro nouveau !
 
Ces défaut sont vraiment rédhibitoires, mais à moins de créer un nouvel algorithme (qui seras très complexe si tu cherches un aléatoire "parfait" ), je ne vois pas trop comment tu peux t'en sortir autrement.

n°1673804
Sakayapo
Posté le 19-01-2008 à 17:16:44  profilanswer
 

leo++ a écrit :


 
Nan mais ca c'est normal, tu as juste reinitialisé la graine (seed en anglais), pour obtenir des tirages aléatoires et tous différents, il n'y a pas de solution toute faite. La manière la plus simple c'est d'enregistrer tous les résultats que tu as eu et de vérifier à chaque fois que le nombre tiré ne s'y situe pas.
 
Tu remarqueras par toi même que cette méthode est assez lourde puisque pour le dernier résultat, avec 997 nombres déja tirés, tu devras faire quelque chose comme 1000 itérations pour obtenir le nombre attendu (qui est déductible de manière simple, pourtant). En plus le nombre d'itérations n'est pas limité ce qui veut dire que tu peux (ca n'arrivera jamais, la probabilité est trop faible) bloquer ton programme à jamais s'il ne tire jamais un numéro nouveau !
 
Ces défaut sont vraiment rédhibitoires, mais à moins de créer un nouvel algorithme (qui seras très complexe si tu cherches un aléatoire "parfait" ), je ne vois pas trop comment tu peux t'en sortir autrement.


 
J'ai entendu parler de l'utilisation d'un tableau dans JCreator permettant ainsi l'affichage de nombres aléatoires tous différents.

n°1673808
kadreg
profil: Utilisateur
Posté le 19-01-2008 à 17:21:59  profilanswer
 

Sakayapo a écrit :


J'ai entendu parler de l'utilisation d'un tableau dans JCreator permettant ainsi l'affichage de nombres aléatoires tous différents.

 

c'est très exactement ce qu'on te dit :

 
brisssou a écrit :

il faut que tu gardes une trace des nombres que tu as déjà eu, et si le nouveau nombre est déjà sorti, tu fais un nouveau tirage. qu'est-ce que t'endive ?

 

et

 
leo++ a écrit :


La manière la plus simple c'est d'enregistrer tous les résultats que tu as eu et de vérifier à chaque fois que le nombre tiré ne s'y situe pas.

 

sauf que rien à voir avec jcreator :o


Message édité par kadreg le 19-01-2008 à 17:22:14

---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
n°1674080
BifaceMcLe​OD
The HighGlandeur
Posté le 20-01-2008 à 19:35:27  profilanswer
 

Une suite de nombres tous différents n'est pas une suite de nombres aléatoires, par définition. Même lorsque c'est une suite de nombres dont l'ordre est aléatoire.
Ca ne rend pas ce genre de suite de nombres moins intéressant, ni moins utile en pratique (exemple : arriver à obtenir un jeu de 32 ou de 54 cartes à jouer qui soit battu), mais ce n'est pas du tout la même chose.
 
D'ailleurs les algorithmes pour l'obtenir sont radicalement différents (tout simplement parce que l'algorithme que kadreg a gentiment rassemblé en un seul post mettra un temps très long pour obtenir les derniers nombres). En gros, l'algormithme le plus simple consiste à partir de l'ensemble des nombres triés (ou non) que l'on souhaite désordonner, de faire deux fois plus de tirages qu'on a de nombres dans l'ensemble, en utilisant les nombres aléatoires tirés comme index pour faire des insertions puis des échanges dans le tableau des nombres à désordonner.
 
Et comme Sun est ton ami, le JDK inclut déjà en standard deux méthodes shuffle() (dans la classe java.util.Collections) qui implémentent déjà ce type d'algorithmes.

n°1680340
verdy_p
Posté le 01-02-2008 à 12:07:21  profilanswer
 

BifaceMcLeOD a écrit :

Et comme Sun est ton ami, le JDK inclut déjà en standard deux méthodes shuffle() (dans la classe java.util.Collections) qui implémentent déjà ce type d'algorithmes.


Avec un petit exemple (simplifié au maximum ici) si on ne comprends toujours pas que shuffle() signifie mélanger (comme on mélange un tas de cartes):

Code :
  1. import java.util.Random;
  2. // (...)
  3. int cartes[998];
  4. // initialisation des cartes dans un paquet trié de 1 à 998 dans l’ordre ; mettez-y les valeurs uniques que vous voulez avoir :
  5. for (int i = 0; i < 998; i++) cartes[i] = i + 1;
  6. // on bat les cartes (shuffle en anglais) :
  7. Random generateur = new Random(); // il nous faut un objet générateur aléatoire
  8. for (int i = 1; i < 998; i++) { // note : on ignore la première carte qui ne peut être mélangée toute seule.
  9.   int alea = generateur.nextInt(i); //tirage d’une position entre 0 et (i - i) dans le tas de cartes déjà mélangé;
  10.   int carte = cartes[alea]; // on extrait une carte du début du paquet déjà mélangé
  11.   // on échange :
  12.   cartes[alea] = cartes[i]; // on place à cette position aléatoire du paquet mélangé la nouvelle carte venant du paquet trié
  13.   cartes[i] = carte; // la carte extraite du paquet mélangé est placée au dessus de ce paquet
  14. }


 
Méthode simple au comportement linéaire. On peut rebattre le paquet si on veut tout le paquet en refaisant la seconde boucle.
Pour décrire cette méthode: on part d'un paquet trié qu'on pose en entier sur une pile à droite, on tire la carte au dessus de cette pile et on extrait une carte au hasard de la pile de gauche (au départ vide), qu'on remplace par la carte qu'on vient de tirer du paquet de droite, cette dernière venant se replacer au dessus du paquet de gauche. Et on réitère jusqu'à ce qu'il n'y ait plus de carte dans la pile de droite.
Cela ne demance aucune insertion, juste un échange local.
 
On montre facilement que le paquet obtenu est mélangé aléatoirement si chacun des tirages aléatoire dans le paquet de gauche est uniforme (les probabilités de tirage de chacun des nombres de 0 à N-1 ne sont pas équitables pour toutes les valeurs de N, malgré le soin apporté dans le générateur utilisé, cependant ce générateur utilise une graine sur 48 bits qui suffit largement pour réaliser de bons tirages pour toutes les valeurs de N jusqu'à 32 bits, et ici on est très loin de cette limite, N valant au maximum 998 ci-dessus).
 
Cependant Random.nextInt() n'est pas parfaitement uniforme (car il utilise un générateur pseudo-aléatoire et non un vrai générateur aléatoire de "qualité militaire" ), il est donc possible voire utile de rebattre une seconde fois (en coupant éventuellement le paquet avant, ce que ne fait pas la méthode shuffle() du JRE, mais rien n'interdit de l'employer une seconde fois).
 
L'équivalent de "couper le paquet" avant de rebattre, c'est ici de remplacer le générateur aléatoire par une nouvelle instance (car chaque générateur instancié par new Random() génère une suite à priori différente, puisque le générateur utilisera une autre "graine", ce qui n'est pas le cas pour le générateur de la classe Math qui est unique et instancié en interne).
 
Cependant j'ai oublié de dire qu'il y avait une méthode shuffle() aussi pour les tableaux, pas seulement les connections.
Voir dans la classe java.util.Arrays... qui permet de mélanger des tableaux de nombres ou d'objets, ce que ne fait pas la méthode shuffle() dans java.util.Collection puisque les tableaux natifs Java ne sont pas des collections.


Message édité par verdy_p le 01-02-2008 à 17:42:22
n°1692057
janpi
Posté le 25-02-2008 à 15:33:32  profilanswer
 

j'aimerais utiliser les nombres aléatoires pour un génerateur d'évenements dans la simulation d'un systeme d'exploitation,je ne vois pas comment lier les nombres aleatoires qui vont etre generés aux différents évenements.

n°1692143
leo++
Chef de file indienne
Posté le 25-02-2008 à 16:38:48  profilanswer
 

janpi a écrit :

j'aimerais utiliser les nombres aléatoires pour un génerateur d'évenements dans la simulation d'un systeme d'exploitation,je ne vois pas comment lier les nombres aleatoires qui vont etre generés aux différents évenements.


 
Map<Critere, Evenement> ? [:pussoforce]


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Nombres aléatoires.

 

Sujets relatifs
Fonction pour des nombres entiers aleatoires?générateur de nombres aléatoires sous Matlab : problème
Alternative au générateur de nombres aléatoires ExcelNombres Aléatoires
[Access] Colonne avec des nombres aléatoires[C] Probleme nombres aléatoires tous differents
Nombres aléatoiresComment obtenir des nombres aléatoires mais seulement des entiers ?
[C] gestion des nombres aléatoiresAlgo de generation de nombres aleatoires ?
Plus de sujets relatifs à : Nombres aléatoires.



Copyright © 1997-2014 Hardware.fr SARL (Signaler un contenu illicite) / Groupe LDLC