Question sur les nombre aléatoires... - Java - Programmation
Marsh Posté le 12-11-2003 à 15:51:42
java.util.Random. Tu fais un nextInt à chaque fois.
Marsh Posté le 12-11-2003 à 16:44:35
Taiche a écrit : java.util.Random. Tu fais un nextInt à chaque fois. |
heu je définit comment l'interval ? si je veu que des nombres entre 10000 et 20000 ou entre 0 et 50000
Marsh Posté le 12-11-2003 à 16:46:40
Sdk a écrit : |
La Javadoc dit :
Citation : public int nextInt(int n) |
Donc pour un truc entre 0 et 50000, tu feras nextInt(50000) et pour un truc entre 10000 et 20000 bin tu feras nextInt(10000) et tu rajouteras 10000
Marsh Posté le 12-11-2003 à 16:46:50
nextInt
public int nextInt(int n)Returns a pseudorandom, uniformly distributed int value between 0 (inclusive) and the specified value (exclusive), drawn from this random number generator's sequence. The general contract of nextInt is that one int value in the specified range is pseudorandomly generated and returned. All n possible int values are produced with (approximately) equal probability. The method nextInt(int n) is implemented by class Random as follows:
je vai lire la doc
merci
edit : grillayd, merci
Marsh Posté le 12-11-2003 à 16:47:39
uriel a écrit : lis la javadoc |
Marsh Posté le 12-11-2003 à 16:49:06
perso je verrais bien un feature du forum forcant a repondre a un questionnaire : "avez vous fais une recherche google / forum /javadoc/msdn ?"
Marsh Posté le 12-11-2003 à 16:49:18
un peu rapide quand même parce que c'est vrai que cette classe pourrait avoir une methode avec un intervalle en argument
Marsh Posté le 12-11-2003 à 16:51:56
uriel a écrit : |
Ouais m'enfin bon, suffit de savoir faire une addition, c'est pas trop la mort
Marsh Posté le 12-11-2003 à 16:57:30
De toute façon, la classe Random elle est pas assez aléatoire : elle fait que des grands nombres.
c'est bien connu
Marsh Posté le 12-11-2003 à 16:58:59
benou a écrit : De toute façon, la classe Random elle est pas assez aléatoire |
Absolument elle est pseudo aleatoire
(ouais je sais que tout le monde le sait mais j'ai envie de faire mon viel fly fuckers du mercredi)
Marsh Posté le 12-11-2003 à 17:15:08
cai la faute à Taiche
Marsh Posté le 12-11-2003 à 17:15:55
DarkLord a écrit : cai la faute à Taiche |
Marsh Posté le 12-11-2003 à 18:15:10
Sdk a écrit : Bonjour, |
Vous avez remarqué que vous avez répondu à côté de la question ? (ou alors la question était mal formulée).
Parce que Random.nextInt() ne garantit en aucun cas que sur n tirages, on obtiendra des tirages tous différents. Un seul exemple, si tu fais 6 tirages aléatoires de nombres compris entre 1 et 6, tu es pratiquement sûr d'obtenir au moins un des nombres plusieurs fois...
Si tu veux une suite de nombres pseudo-aléatoires et, en même temps, la garantie de l'unicité de ces nombres, alors il faut utiliser une méthode différente : tirage de nombre aléatoires en les triant pour être sûrs qu'ils soient tous différents, puis un shuffle() sur la liste des nombres obtenus (voir la classe Arrays ou Collections, je ne sais plus).
Marsh Posté le 12-11-2003 à 18:27:12
BifaceMcLeOD a écrit : |
han moi je pensai ke ca le fesai tout seul snif
bah y ont tous mal lu alors
Marsh Posté le 12-11-2003 à 18:51:32
Sdk a écrit : |
en effet.
bien vu BifaceMcLeOD
Marsh Posté le 12-11-2003 à 22:16:52
Marsh Posté le 13-11-2003 à 00:53:47
BifaceMcLeOD a écrit : Un seul exemple, si tu fais 6 tirages aléatoires de nombres compris entre 1 et 6, tu es pratiquement sûr d'obtenir au moins un des nombres plusieurs fois... |
faudra m'expliquer comment tu esperes obtenir 6 nombres differents entre 1 et 6 alors
Marsh Posté le 13-11-2003 à 00:54:46
the real moins moins a écrit : faudra m'expliquer comment tu esperes obtenir 6 nombres differents entre 1 et 6 alors |
1 2 3 4 5 6
Marsh Posté le 13-11-2003 à 00:59:00
ReplyMarsh Posté le 13-11-2003 à 04:33:08
Si tu veux faire ce qu'a dit BifaceMcLeOD, je propose la méthode suivante : tu utilises un tableau T de N éléments. Les T[i] contiennent chacun un des nombres que tu veux pouvoir tirer (tous différents donc). Tu tires un nombre aléatoire i entre 0 et N-1, qui te donnes ton premier nombre aléatoire : T[i]. Puis tu place T[N-1] dans T[i]. Tu recommences en tirant un nouveau nombre aléatoire entre 0 et N-2. Et ainsi de suite.
Par exemple avec N=3 : T[0] = 0, T[1] = 1, T[2] = 2. Tu tires un nombre entre 0 et 2, par exemple 1. Ton premier nombre et donc T[1], soit 1. Tu place donc 2 (T[2]) dans T[1]. Puis tu tires un nouveau nombre entre 0 et 2. Encore 1 par exemple. Ton deuxième nombre est donc T[1], soit 2.
Marsh Posté le 13-11-2003 à 11:56:18
Matafan> Il y a déjà un algorithme performant de mélange aléatoire dans l'API standard...
Marsh Posté le 13-11-2003 à 12:04:17
Sdk a écrit : |
En fait, ça ne se fait pas tout seul, parce que dans la réalité, les tirages aléatoires ne sont pas ainsi. Comme le montre l'exemple du tirage de dés.
C'est d'ailleurs un peu comme cela que des profs de statistiques se la jouent... Ils répartissent leur classe en 2, demandent pour le cours suivant à la moitié des élèves de tirer n fois un dé et de l'écrire sur une feuille, et à l'autre moitié d'imaginer n tirages de dés et de l'écrire sur une feuille. Ces profs prétendent ensuite être capable de deviner quelles suites de tirages sont de véritables tirages de dés et lesquels n'en ont pas, avec au moins 95% de réussite. Et le pire, c'est qu'ils y arrivent...
Marsh Posté le 24-11-2003 à 23:53:57
Moi, j'utiliserai Random.nextInt en combinaison avec un HashSet (ou un LinkedHashSet si l'ordre de generation a de l'importance).
Tu generes un nombre, tu testes s'il existe deja ou pas dans le HashSet (methode HashSet.contains). S'il y est, tu generes un autre nombre avec nextInt. S'il y est pas, tu l'ajoutes au HashSet (methode HashSet.add) et ainsi de suite jusqu'a ce que tu ais le nombre requis d'element (tu peut obtenir le nombre d'elements avec la methode HashSet.size)
Voila
Marsh Posté le 25-11-2003 à 01:21:34
scubapro10 a écrit : |
le problèmle étant que si tu veux générer par exemple 99'999 chiffres différents entre 1 et 100'000, ta méthode risque de durer une plombe
Si tu as pas de chance, elle s'arrêtera jamais
Marsh Posté le 07-01-2005 à 10:43:21
Moi j'ai une méthode bon ca vaut ce que ca vaut.
Imaginons que tu veuilles 100 nombres différents entre 0 et 1000.
Tu crée un tableau a 2 colonnes et 1001 lignes
Dans la première colonne tu mets les entiers de 0 à 1000.
Dans la 2ème colonne tu mets des nombres aléatoires (n'importe quoi, par défaut entre 0 et 1).
Ensuite tu trie selon la 2ème colonne.
Et tu prend les 100 premiers nombres de la 1ère colonne.
Après je te laisse le choix de l'implémentation mais l'algo fonctionne et c'est pas le plus long a calculer...
PS : oups, j'ai pas vu la date... je lisait le topic "[Taupik fun] La plus grosse honte de votre vie?" page 181 (et oui je lis tout depuis le début) et un lien m'a emmené ici. J'ai répondu sans réfléchir...
Marsh Posté le 07-01-2005 à 10:53:15
Joli déterrage de topic.
Très mauvaise méthode proposée !
Marsh Posté le 21-01-2005 à 14:25:54
ReplyMarsh Posté le 21-01-2005 à 14:28:33
le plus simple c'est de de faire du shuffle sur un tableau
Marsh Posté le 21-01-2005 à 14:40:18
Oui mais quel est l'algo qui se cache derrière le mot "shuffle" ?
Ca serait pas ce que j'ai écrit plus haut ?
Marsh Posté le 21-01-2005 à 18:21:33
Ourson Noir a écrit : |
Marsh Posté le 12-11-2003 à 15:51:03
Bonjour,
j'ai besoin de généré un certain nombre de nombre entre 0 et n, mais je ne doit pas avoir deux fois le meme
comment faire ca ?
je pensait a une boucle de Math.random(), mais comment m'assurer que je n'ais pas deux fois le meme nombre ?
merci