Nombres aléatoires. - Java - Programmation
Marsh Posté le 14-01-2008 à 10:36:06
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
Marsh Posté le 15-01-2008 à 00:16:13
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.
Marsh Posté le 15-01-2008 à 11:42:08
Quelle belle histoire
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
Marsh Posté le 15-01-2008 à 12:02:50
charly007 a écrit : C'est le principe des tirages indépendants. |
aussi appellée "un dé n'a pas de mémoire "
Marsh Posté le 18-01-2008 à 16:09:54
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!
Marsh Posté le 18-01-2008 à 16:19:00
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 ?
Marsh Posté le 19-01-2008 à 02:46:34
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 ? |
En réinitialisant une, deux, ou plusieurs fois les nombres aléatoires, il y a toujours un minimum de deux valeurs identiques!
Marsh Posté le 19-01-2008 à 14:43:06
Sakayapo 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.
Marsh Posté le 19-01-2008 à 17:16:44
leo++ 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.
Marsh Posté le 19-01-2008 à 17:21:59
Sakayapo a écrit :
|
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 :
|
sauf que rien à voir avec jcreator
Marsh Posté le 20-01-2008 à 19:35:27
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.
Marsh Posté le 01-02-2008 à 12:07:21
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 :
|
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.
Marsh Posté le 25-02-2008 à 15:33:32
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.
Marsh Posté le 25-02-2008 à 16:38:48
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> ?
Marsh Posté le 14-01-2008 à 02:49:03
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.