Comment générer des 6 différents nombres aléatoires en java
Je veux générer 6 différents nombres aléatoires en utilisant les Mathématiques.aléatoire et de les stocker dans un tableau.
Comment puis-je m'assurer qu'ils sont différents? Je sais que je dois utiliser pour-boucle pour vérifier le tableau mais comment...
C'est la plage. J'ai seulement besoin de numéros entre 1 et 49.
( 1 + (int) (Math.random() * 49) )
Il suffit de garder de générer des nombres et de les ajouter au tableau tant qu'ils sont uniques; générer un nombre et de vérifier sur les autres dans le tableau.
Exactement de la même manière que vous le feriez si vous le faisiez à la main. Dés pour obtenir un numéro de téléphone, vérifiez si c'est un numéro que vous ne l'avez pas déjà, l'enregistrer, de la répétition jusqu'à ce que vous avez autant que vous le souhaitez. - Ou mettre en place votre propre shuffle, qui est la plus générale de la solution.
Exactement de la même manière que vous le feriez si vous le faisiez à la main. Dés pour obtenir un numéro de téléphone, vérifiez si c'est un numéro que vous ne l'avez pas déjà, l'enregistrer, de la répétition jusqu'à ce que vous avez autant que vous le souhaitez. - Ou mettre en place votre propre shuffle, qui est la plus générale de la solution.
OriginalL'auteur coding | 2014-03-22
Vous devez vous connecter pour publier un commentaire.
Dans Java 8:
Dans Java 7:
Juste un peu de messier. Pas aidé par le fait qu'il est assez fastidieux de unbox la
Set<Integer>
dans unint[]
.Il convient de noter que cette solution doit être fine du nombre de valeurs est significativement plus petits de la gamme. Comme
1..49
est beaucoup plus grande que6
vous êtes fine. Sinon, la performance se dégrade rapidement.Il ne sera pas question de l'OP, mais quand même... je ne peux pas aider mais disappreciate tels mignon one-liners avec de mauvaises caractéristiques de performance. J'ai vu ma part de leur en Clojure.
Je suis d'accord avec @MarkoTopolnik. Alors que c'est un bon one-liner, la solution de JBNizet est beaucoup plus efficace. +1 Si.
Dans les deux cas, HashSet est utilisée, ce qui est un mauvais choix. par exemple, ajouter de 0 à 10, à un HashSet dans n'importe quel ordre et il va arriver à les placer dans l'ordre de tri. c'est à dire HashSet n'est pas si aléatoire.
Je n'avais pas pensé à l'ordre naturel, si les articles dans un
Set
- c'est un très bon point. Je suppose queLinkedHashSet
serait de travailler dans le second cas. Dans le premier cas, je ne suis pas sûr de savoir comment le corriger...OriginalL'auteur Boris the Spider
Créer une liste contenant les numéros de 1 à 49.
Créer un nombre aléatoire
x
entre 0 et la taille de la liste, de prendre le numéro d'indexx
dans la liste, et l'enlever de la liste.Répétez l'étape précédente 5 fois. Et vous avez terminé. Notez que
java.util.Random
a unnextInt(int max)
méthode que vous devez utiliser à la place deMath.random()
.Remarque concernant la performance: cette solution a un avantage par rapport à la "essayer jusqu'à ce que vous recevez 6 numéros différents" différentes solutions: il s'exécute en O(n) fois. Il n'a pas beaucoup d'importance pour 6 numéros uniques sur 50, mais si vous voulez obtenir 48 ou 49 nombres aléatoires de 50, vous allez commencer à voir une différence, parce que vous pourriez avoir à générer les nombres aléatoires avant de faire celui qui n'est pas déjà dans le jeu.
EDIT:
pour réduire le coût induit par la suppression des éléments dans la liste, vous pouvez simplement remplacer l'élément à l'index
x
avec le dernier élément de la liste (et à la deuxième itération, avec l'élément à la taille - 2, etc.)remplacer utilisés dans la fente avec le nombre de la fin serait suffisant, sauf si vous utilisez à la fin du tableau en tant que votre sortie. Vous pouvez facilement le faire avec
subList
, cependant.d'accord. Je vais modifier ma réponse.
OriginalL'auteur JB Nizet
Vous pouvez utiliser un
Set
.Ce qui est suffisant pour ce faire, dans votre cas, parce que le nombre d'agents de nombres aléatoires est relativement petite par rapport à la taille de la plage vous de les générer.
Sinon j'irais avec @JBNizet approche.
OriginalL'auteur Alexis C.
Générer de 6 numéros (non nécessairement distinctes). Les commander.
a1 <= a2 <= a3 <= a4 <= a5 <= a6
Maintenant prendre ces 6 numéros
a1 < a2 + 1 < a3 + 2 < a4 + 3 < a5 + 4 < a6 + 5
Ces 6 sont différents et aléatoires.
L'idée de cette construction vient d'une combinatoire de preuves.
Son avantage est qu'il est simple, rapide et déterministe.
Je pense que la complexité du temps est
O(count*log(count))
.Je me demande si cela peut être amélioré.
Ouais, me semble que je devrais avoir fait
int max = 44;
Puis l'augmentation de ceux ne peut pas aller sur 49.n'est-ce pas réduire la probabilité d'obtenir des numéros dans la gamme de 0 à 5? C'est toujours une bonne solution évolutive, qui est plus rapide que les autres
OriginalL'auteur peter.petrov
Au lieu de vérifier que le tableau n'a pas de doublons, vous pouvez utiliser un peu plus d'élégance tout en générant des nombres, tels que l'unicité est appliquée dès le début.
boolean[]
tant que votre gamme (49 entrées);boolean[]
;boolean[]
, en comptant tous les non-croisé des entrées. Arrêtez-vous lorsque vous atteignez le comte égal au nombre aléatoire généré à l'étape 5. Le numéro correspondant à l'entrée est de votre numéro de sortie;Peut-être cela? stackoverflow.com/questions/196017/unique-random-numbers-in-o1
c'est fondamentalement la même idée que dans ma réponse, sauf qu'au lieu de supprimer des numéros de la liste, vous marquer comme supprimé dans le booléen tableau et ne compte pas le logiquement supprimé les numéros lors de l'itération. Maintenant que j'y pense, je ne suis pas sûr que ce serait plus efficace que mon algorithme, qui devient de plus en plus efficace, aussi longtemps que les numéros sont supprimés de la liste.
Oh ... OK, pas entièrement convaincu, mais OK, je vous crois sur ce coup 😉
la permutation des nombres au lieu de les enlever est en effet une bonne idée. Il y a une bonne raison, je ne suis pas nommé Knuth, ni de Fisher-Yates 🙂
OriginalL'auteur Marko Topolnik
dans votre cas n=6
OriginalL'auteur TheLastOfTheMoops
J'ai juste eu une petite idée pour Java 8-.
OriginalL'auteur ar4ers
Juste continuer de générer des nombres et de les ajouter au tableau tant qu'ils sont uniques; psuedocode:
OriginalL'auteur Brendan
Créer une variable dernier; initialiser
0
.Prochain, dans une boucle x de 0 à 5, de créer un nombre aléatoire entre
last+1
et49-6+x
. Stocker ce nombre dans une liste et définirlast
le nombre généré de cette façon.Vous allez vous retrouver avec une liste ordonnée de 6 nombres aléatoires dans la gamme de 1..49 sans répétition.
OriginalL'auteur usr2564301
Que le code générer des nombres de 1000 à 100000 et l'enregistrer dans la liste de tableaux.
Si le nombre généré a été dupliqué le programme de générer des nombres à nouveau.
Si le nombre généré est différent que le nombre est ajouté.
Code:
OriginalL'auteur Ilya Budu