Générer la non répétition de nombre aléatoire au sein de la gamme en Java
Je veux générer des nombres aléatoires à l'intérieur de la fourchette de 1 à 4, 4, y compris.
Voici mon code:
int num = r.nextInt(4) + 1; //r is instance of Random.
Cependant, je suis en cours d'exécution le code ci-dessus dans une boucle et ne veulent pas répéter de nombre aléatoire.
Ce qui arrive maintenant est souvent que j'obtiens:
1,1,1,2,3,1,4,2,2,1,4,2,4,4,2,1,4,3,3,1,4,2,4,1
que ma sortie.
Ici, si les chiffres sont aléatoires au sein de la gamme(1-4), mais souvent répétés, comme le nombre de "1"dans les 3 premières itérations.
Ce que je cherche, c'est un moyen d'obtenir la non répétition de nombres aléatoires à l'intérieur de la boucle.
La manière la plus simple je sais, c'est de garder le dernier nombre aléatoire avant de l'itération en cours et de comparer, mais je suis sûr qu'il doit y avoir une meilleure solution à ce.
Merci à l'avance.
eh bien, après vous produire, disons,
4,1,3,2
, vous allez avoir de répétitions... comment voulez-vous gérer ce cas?aussi, je suis d'accord avec la collecte.shuffle(), mais serait-ce une bonne idée d'appeler collection.shuffle() à chaque itération et qui fou la preuve de la non répétitif de la nature ?
Je suis bien en
4,1,3,2
ce que je ne veux pas, c'est 1,1,3,4,2,2
. Les mêmes numéros apparaissant côte à côte.Donc
4,1,3,4,1,2,3,2
serait ok aussi?
OriginalL'auteur ashish.gd | 2012-12-13
Vous devez vous connecter pour publier un commentaire.
Utilisation
random.nextInt(range-1)
et puis la carte de ce numéro à la sortie avec un numéro de fonction, à l'exclusion du numéro précédent:Cela pourrait produire un certain nombre qui est max+1
Mais j'ai commencer avec un nombre aléatoire choisi à partir d'un ensemble qui est un de moins que le nombre de nombres entiers. En cas de doute, veuillez exécuter pour vous en convaincre.
Ce n'est certainement préféré aléatoire d'un ensemble de nombres à chaque étape.
Il peut en fait pas, il décale l'ensemble haut de gamme, c'est à dire Si la précédente est de 2, il prend la gamme
1 2 3
et décale le haut pour être1 3 4
en ajoutant un au les nombres les plus élevés, si cela fait sensOriginalL'auteur Marko Topolnik
Il n'y a pas de "meilleure" réponse.
Vous êtes l'obtention d'un aléatoire nombre. Cochez cette ligne:
ce pourrait être parfaitement aléatoire.
Donc je vous propose de décrire une meilleure condition.
Voulez-vous toujours un prochain numéro qui est différente de la précédente? Voulez-vous un maximum de doublons dans un rang spécial? disons que dans un délai de 6 numéros consécutifs, chaque numéro est autorisé à se produire deux fois?
Si vous apportez une telle exigence, nous pourrions être en mesure de vous aider. sinon on peut juste dire: ce que vous voyez est vraiment aléatoire 🙂
Random random = new Random(441287210); for(int i=0;i<10;i++) System.out.print(random.nextInt(10)+" "); }
😉OriginalL'auteur Fabian Lange
Que vous avez plus de numéros que vous avez le choix de vous avoir à répéter certains numéros. Tout ce que vous pouvez faire est de minimiser le nombre immédiate de répétitions.
Une façon de le faire est d'utiliser des Collections.shuffle qui vous permettent d'avoir des numéros dans un ordre aléatoire, sans répétitions et de le faire à chaque fois. Vous pouvez prévenir la dernière valeur de N être répétée.
Pour arrêter la répétition des nombres consécutifs, vous pouvez réduire la distance et d'utiliser le module.
Ce travail, car il n'y a vraiment que
max-1
valeurs possibles que vous êtes à l'exclusion de la dernière valeur utilisée.3,2,2,3
,2,3,2,3
est ok, la lecture aléatoire est overkillAinsi, l'ajout de 1 à 4 dans une collection, puis en appelant les Collections.shuffle à chaque itération, de choisir le premier élément qui devrait résoudre mon problème ?
Oui, je ne veux pas même les numéros de côté par côté et essayer de mon mieux pour éviter shuffle 🙁
Appel aléatoire à chaque fois que vous avez utilisé toutes les valeurs dans la liste
À l'aide de toutes les valeurs est très bien, puisque je vais l'utiliser dans une boucle. Tout ce que je veux dire si il y a 10 itérations dans ma boucle, je vais bien évidemment de 10 nombres aléatoires entre 1 - 4. Convenu qu'ils seront répétés. Mais je ne veux pas en répétant en séquence, c'est à dire
2,3,2,3
est OK mais pas2,2,3,3
.OriginalL'auteur Peter Lawrey
Voici un algorithme:
Imaginer Un est un sac de boules avec des numéros de 1 à 4. Chaque itération de la boucle, vous retirez une balle. Plutôt que de supprimer à partir de la matrice, ce qui est expenisve, il vous suffit de cacher la balle à la fin du tableau. Lorsque vous décrémenter le nombre de boules dans le sac (Acnt), la prochaine balle, vous sélectionnez vient de la non-billes cachées.
Lorsque vous n'avez plus de balles pour sélectionner, vous affichez les boules en remettant à zéro le nombre de balles dans votre sac à dos pour le dénombrement complet.
C'est essentiellement le standard de l'algorithme de shuffle.
Edit: en Relisant la question, je vois maintenant qu'il permet répète après seulement 1 numéro au lieu de l'ensemble de la séquence, auquel cas, tout ce que vous devez faire pour modifier ce changement si (Acnt == 0) si(Acnt == longueur(A) - 1).
C'est probablement exactement la même. L'avantage de le faire en direct est que il obtenir les chiffres un à la fois.
OriginalL'auteur frankc