Il s'agit de la méthode SDK que vous recherchez Collections.shuffle (Arrays.asList (array));
Louis Hong
2
@Louie Non, ça ne marche pas. Cela créerait une List<int[]>entrée contenant une. Voir ma réponse pour savoir comment y parvenir en utilisant Collections.shuffle().
Duncan Jones
2
Pas vraiment une réponse à la question d'origine, mais MathArrays.shuffle de la bibliothèque commons-math3 fait le travail.
sandris
1
Ce n'est pas assez sur le sujet pour justifier une réponse, mais je me souviens d'un article vraiment cool du livre "Graphics Gems" qui parlait de traverser un tableau dans un ordre pseudo aléatoire. Dans mon esprit, cela vaut mieux que de mélanger les données en premier lieu. L'implémentation C se trouve ici github.com/erich666/GraphicsGems/blob/master/gems/Dissolve.c
Utiliser des collections pour mélanger un tableau de types primitifs est un peu exagéré ...
Il est assez simple d'implémenter la fonction vous-même, en utilisant par exemple le shuffle de Fisher – Yates :
import java.util.*;import java.util.concurrent.ThreadLocalRandom;classTest{publicstaticvoid main(String args[]){int[] solutionArray ={1,2,3,4,5,6,16,15,14,13,12,11};
shuffleArray(solutionArray);for(int i =0; i < solutionArray.length; i++){System.out.print(solutionArray[i]+" ");}System.out.println();}// Implementing Fisher–Yates shufflestaticvoid shuffleArray(int[] ar){// If running on Java 6 or older, use `new Random()` on RHS hereRandom rnd =ThreadLocalRandom.current();for(int i = ar.length -1; i >0; i--){int index = rnd.nextInt(i +1);// Simple swapint a = ar[index];
ar[index]= ar[i];
ar[i]= a;}}}
Nitpick extrêmement trivial, mais vous pouvez simplement utiliser à la println()place de println(""). Plus clair dans l'intention je pense :)
Cowan
55
Il serait préférable d'utiliser Collections.shuffle (Arrays.asList (array)); puis faire un mélange vous-même.
Louis Hong
21
@Louie Collections.shuffle(Arrays.asList(array))ne fonctionne pas, car ne Arrays.asList(array)revient Collection<int[]>pas Collection<Integer>comme vous le pensiez.
Adam Stelmaszczyk
15
@exhuma Parce que si vous avez un tableau de milliers ou de millions de valeurs primitives à trier, envelopper chacune dans un objet juste pour faire un tri est un peu coûteux, à la fois en mémoire et en CPU.
PhiLho
14
Ce n'est pas le remaniement Fisher-Yates. C'est ce qu'on appelle le shuffle de Durstenfeld . Le shuffle de pêcheur d'origine fonctionne en temps O (n ^ 2), ce qui est extrêmement lent.
Pacerier
164
Voici une manière simple d'utiliser un ArrayList:
List<Integer> solution =newArrayList<>();for(int i =1; i <=6; i++){
solution.add(i);}Collections.shuffle(solution);
@Timmos Vous vous trompez. Arrays.asList enveloppe le tableau d'origine et donc le modifier modifie le tableau d'origine. C'est pourquoi vous ne pouvez pas ajouter ou supprimer, car les tableaux sont de taille fixe.
Nand
@Nand pas sûr de ce que je pensais, mais en regardant le code source, en effet la méthode Arrays.asList crée un ArrayList soutenu par le tableau donné. Merci de l'avoir signalé. Supprimé mon commentaire précédent (impossible de le modifier).
Timmos
100
Voici une fonction de mélange aléatoire et efficace de Fisher – Yates:
privatestaticvoid shuffleArray(int[] array){int index;Random random =newRandom();for(int i = array.length -1; i >0; i--){
index = random.nextInt(i +1);if(index != i){
array[index]^= array[i];
array[i]^= array[index];
array[index]^= array[i];}}}
ou
privatestaticvoid shuffleArray(int[] array){int index, temp;Random random =newRandom();for(int i = array.length -1; i >0; i--){
index = random.nextInt(i +1);
temp = array[index];
array[index]= array[i];
array[i]= temp;}}
A voté parce que j'avais besoin d'une solution qui n'avait pas le surcoût élevé de création d'une Collection d'Integer
mwk
2
La deuxième implémentation n'a-t-elle pas le potentiel d'échanger avec son propre index? random.nextInt(int bound)est exclusif mais le donner i + 1comme argument permettrait indexet ipourrait être le même.
bmcentee148
21
@ bmcentee148 L'échange d'un élément avec lui-même est autorisé dans un ordre aléatoire. Ne pas comprendre cela a affaibli l'Enigma et a permis à Alan Turing de le casser. en.wikipedia.org/wiki/…
Ellen Spertus
4
L' xorastuce est idéale pour échanger des registres de CPU lorsque le CPU n'a pas d'instruction de swap et qu'il n'y a pas de registres libres, mais pour échanger des éléments de tableau dans une boucle, je ne vois aucun avantage. Pour les variables locales temporaires, il n'y a aucune raison de les déclarer en dehors de la boucle.
Holger
1
Il est légèrement plus efficace de déclarer la tempvariable en dehors de la boucle. L' XORastuce devrait être plus rapide que d'utiliser une tempvariable, mais la seule façon de s'assurer qu'elle effectue un test de référence.
Dan Bray
25
La classe Collections a une méthode efficace pour mélanger, qui peut être copiée, afin de ne pas en dépendre:
/**
* Usage:
* int[] array = {1, 2, 3};
* Util.shuffle(array);
*/publicclassUtil{privatestaticRandom random;/**
* Code from method java.util.Collections.shuffle();
*/publicstaticvoid shuffle(int[] array){if(random ==null) random =newRandom();int count = array.length;for(int i = count; i >1; i--){
swap(array, i -1, random.nextInt(i));}}privatestaticvoid swap(int[] array,int i,int j){int temp = array[i];
array[i]= array[j];
array[j]= temp;}}
pour ne pas en dépendre ? Je préférerais de beaucoup en dépendre, si cela n'était possible.
shmosel
@shmosel Alors n'hésitez pas à l'utiliser. Assurez-vous que vous importez la classe requise et que vous avez converti le tableau en une liste avec Arrays.asList. Vous devez également convertir la liste résultante en tableau
KitKat
Vous ne pouvez pas utiliser Arrays.asList()sur un tableau primitif. Et vous n'auriez pas besoin de le reconvertir car c'est juste un wrapper.
shmosel
13
Regardez la Collectionsclasse en particulier shuffle(...).
Comment utilisez-vous cette classe Collections dans Android? Vous devez faire une importation spéciale (CRTL SHIFT O ne fonctionne pas) pour l'utiliser?
Hubert
@Hubert, il devrait faire partie du package java.util. Il fait partie de la bibliothèque standard depuis la v1.2.
MauganRa
3
Pour rendre votre réponse plus autonome, elle doit contenir un exemple de code. IE:import java.util.Collections; shuffle(solutionArray);
Stevoisiak
10
Voici une solution complète utilisant l' Collections.shuffleapproche:
publicstaticvoid shuffleArray(int[] array){List<Integer> list =newArrayList<>();for(int i : array){
list.add(i);}Collections.shuffle(list);for(int i =0; i < list.size(); i++){
array[i]= list.get(i);}}
Notez qu'il souffre en raison de l'incapacité de Java à traduire en douceur entre int[]et Integer[](et donc int[]et List<Integer>).
Ci-dessous, trois implémentations différentes d'un shuffle. Vous ne devez utiliser Collections.shuffle que si vous avez affaire à une collection. Il n'est pas nécessaire d'envelopper votre tableau dans une collection juste pour le trier. Les méthodes ci-dessous sont très simples à mettre en œuvre.
Vous ne chronométrez pas les mêmes choses et vous chronométrez chacune une seule fois (alors leur ordre compte et vous oubliez l'optimisation de l'exécution). Vous devez appeler range, toArrayet toPrimitiveavant tout chronométrage, et boucler pour pouvoir conclure quoi que ce soit (pseudo-code: faire plusieurs fois {générer la liste, arr et iarr; liste de lecture aléatoire; liste de lecture aléatoire arr; liste de lecture aléatoire iarr}). Mes résultats: 1er: list: 36017ns, arr: 28262ns, iarr: 23334ns. 100: list: 18445ns, arr: 19995ns, iarr: 18657ns. Cela montre simplement que int [] est pré-optimisé (par code) mais ils sont presque équivalents à l'optimisation d'exécution.
syme
9
L'utilisation ArrayList<Integer>peut vous aider à résoudre le problème du brassage sans appliquer beaucoup de logique et consommer moins de temps. Voici ce que je propose:
ArrayList<Integer> x =newArrayList<Integer>();for(int i=1; i<=add.length(); i++){
x.add(i);}Collections.shuffle(x);
Il n'y a rien de spécifique à Java8 dans ce code. Cela fonctionne depuis Java2. Eh bien, cela fonctionnerait, une fois que vous corrigez l'incohérence entre la première utilisation listet la référence soudaine cardsList. Mais comme vous devez créer le temporaire list, que vous avez omis, l' Collections.shuffle(Arrays.asList(arr));approche présentée à plusieurs reprises ici ne présente aucun avantage . Qui fonctionne également depuis Java2.
Holger
3
Voici une version générique pour les tableaux:
import java.util.Random;publicclassShuffle<T>{privatefinalRandom rnd;publicShuffle(){
rnd =newRandom();}/**
* Fisher–Yates shuffle.
*/publicvoid shuffle(T[] ar){for(int i = ar.length -1; i >0; i--){int index = rnd.nextInt(i +1);
T a = ar[index];
ar[index]= ar[i];
ar[i]= a;}}}
Étant donné que ArrayList n'est fondamentalement qu'un tableau, il peut être conseillé de travailler avec un ArrayList au lieu du tableau explicite et d'utiliser Collections.shuffle (). Cependant, les tests de performances ne montrent aucune différence significative entre ce qui précède et Collections.sort ():
Shuffe<Integer>.shuffle(...) performance:576084 shuffles per second
Collections.shuffle(ArrayList<Integer>) performance:629400 shuffles per second
MathArrays.shuffle(int[]) performance:53062 shuffles per second
L'implémentation d'Apache Commons MathArrays.shuffle est limitée à int [] et la pénalité de performance est probablement due au générateur de nombres aléatoires utilisé.
Il semble que vous puissiez passer new JDKRandomGenerator()à MathArrays.shuffle. Je me demande comment cela affecte la performance?
Brandon
En fait ... il ressemble MathArrays#shufflea une allocation dans sa boucle de base: int targetIdx = new UniformIntegerDistribution(rng, start, i).sample();. Bizarre.
Brandon
3
Random rnd =newRandom();for(int i = ar.length -1; i >0; i--){int index = rnd.nextInt(i +1);// Simple swapint a = ar[index];
ar[index]= ar[i];
ar[i]= a;}
Par ailleurs, j'ai remarqué que ce code renvoie un ar.length - 1certain nombre d'éléments, donc si votre tableau a 5 éléments, le nouveau tableau mélangé aura 4 éléments. Cela se produit car la boucle for indique i>0. Si vous passez à i>=0, tous les éléments sont mélangés.
Juste un avertissement, vous voudrez peut-être déplacer cela dans la section des commentaires de votre question, car il sera probablement signalé s'il est laissé comme sa propre réponse.
Jason D
1
Cela semble répondre à la question, donc je ne sais pas de quoi vous parlez @JasonD
Sumurai8
1
Le code est correct, le commentaire est faux. Si vous passez i>0à i>=0, vous perdez du temps en échangeant l'élément 0avec lui-même.
jcsahnwaldt Reinstate Monica
3
Voici une solution utilisant Apache Commons Math 3.x (pour les tableaux int [] uniquement):
Alternativement, Apache Commons Lang 3.6 a introduit de nouvelles méthodes de lecture aléatoire dans la ArrayUtilsclasse (pour les objets et tout type primitif).
J'ai vu des informations manquantes dans certaines réponses, j'ai donc décidé d'en ajouter une nouvelle.
Collections Java Arrays.asList prend var-arg de type T (T ...). Si vous passez un tableau primitif (int array), la méthode asList déduira et générera unList<int[]> , qui est une liste à un élément (le premier élément est le tableau primitif). si vous mélangez cette liste d'éléments, cela ne changera rien.
Donc, vous devez d'abord convertir votre tableau primitif en tableau d'objets Wrapper. pour cela, vous pouvez utiliser la ArrayUtils.toObjectméthode de apache.commons.lang. puis passez le tableau généré à une liste et mélangez-le finalement.
int[] intArr ={1,2,3};List<Integer> integerList =Arrays.asList(ArrayUtils.toObject(array));Collections.shuffle(integerList);//now! elements in integerList are shuffled!
publicList<Integer> shuffleArray(List<Integer> a){List<Integer> b =newArrayList<Integer>();while(a.size()!=0){int arrayIndex =(int)(Math.random()*(a.size()));
b.add(a.get(arrayIndex));
a.remove(a.get(arrayIndex));}return b;}
Choisissez un nombre aléatoire dans la liste d'origine et enregistrez-le dans une autre liste. Supprimez ensuite le numéro de la liste d'origine. La taille de la liste d'origine continuera de diminuer d'une unité jusqu'à ce que tous les éléments soient déplacés vers la nouvelle liste.
Je me penche sur cette question très populaire parce que personne n'a écrit une version à lecture aléatoire. Le style est largement emprunté à Arrays.java, car qui ne pille pas la technologie Java de nos jours? Générique et intimplémentations inclus.
/**
* Shuffles elements from {@code original} into a newly created array.
*
* @param original the original array
* @return the new, shuffled array
* @throws NullPointerException if {@code original == null}
*/@SuppressWarnings("unchecked")publicstatic<T> T[] shuffledCopy(T[] original){int originalLength = original.length;// For exception priority compatibility.Random random =newRandom();
T[] result =(T[])Array.newInstance(original.getClass().getComponentType(), originalLength);for(int i =0; i < originalLength; i++){int j = random.nextInt(i+1);
result[i]= result[j];
result[j]= original[i];}return result;}/**
* Shuffles elements from {@code original} into a newly created array.
*
* @param original the original array
* @return the new, shuffled array
* @throws NullPointerException if {@code original == null}
*/publicstaticint[] shuffledCopy(int[] original){int originalLength = original.length;Random random =newRandom();int[] result =newint[originalLength];for(int i =0; i < originalLength; i++){int j = random.nextInt(i+1);
result[i]= result[j];
result[j]= original[i];}return result;}
Il s'agit de l'algorithme de lecture aléatoire de knuth.
publicclassKnuth{// this class should not be instantiatedprivateKnuth(){}/**
* Rearranges an array of objects in uniformly random order
* (under the assumption that <tt>Math.random()</tt> generates independent
* and uniformly distributed numbers between 0 and 1).
* @param a the array to be shuffled
*/publicstaticvoid shuffle(Object[] a){int n = a.length;for(int i =0; i < n; i++){// choose index uniformly in [i, n-1]int r = i +(int)(Math.random()*(n - i));Object swap = a[r];
a[r]= a[i];
a[i]= swap;}}/**
* Reads in a sequence of strings from standard input, shuffles
* them, and prints out the results.
*/publicstaticvoid main(String[] args){// read in the dataString[] a =StdIn.readAllStrings();// shuffle the arrayKnuth.shuffle(a);// print results.for(int i =0; i < a.length; i++)StdOut.println(a[i]);}}
La solution la plus simple pour ce mélange aléatoire dans un tableau.
String location[]={"delhi","banglore","mathura","lucknow","chandigarh","mumbai"};int index;String temp;Random random =newRandom();for(int i=1;i<location.length;i++){
index = random.nextInt(i+1);
temp = location[index];
location[index]= location[i];
location[i]= temp;System.out.println("Location Based On Random Values :"+location[i]);}
publicstaticvoid randomizeArray(int[] arr){Random rGenerator =newRandom();// Create an instance of the random class for(int i =0; i< arr.length;i++){//Swap the positions...int rPosition = rGenerator.nextInt(arr.length);// Generates an integer within the range (Any number from 0 - arr.length)int temp = arr[i];// variable temp saves the value of the current array index;
arr[i]= arr[rPosition];// array at the current position (i) get the value of the random generated
arr[rPosition]= temp;// the array at the position of random generated gets the value of temp}for(int i =0; i<arr.length; i++){System.out.print(arr[i]);//Prints out the array}}
Veuillez ajouter une description connexe concernant votre réponse.
ankit suthar
0
import java.util.ArrayList;import java.util.Random;publicclass shuffle {publicstaticvoid main(String[] args){int a[]={1,2,3,4,5,6,7,8,9};ArrayList b =newArrayList();int i=0,q=0;Random rand =newRandom();while(a.length!=b.size()){int l = rand.nextInt(a.length);//this is one option to that but has a flaw on 0// if(a[l] !=0)// {// b.add(a[l]);// a[l]=0;// // }// // this works for every no. if(!(b.contains(a[l]))){
b.add(a[l]);}}// for (int j = 0; j <b.size(); j++) {// System.out.println(b.get(j));// // }System.out.println(b);}}
Random r =newRandom();int n = solutionArray.length;List<Integer> arr =Arrays.stream(solutionArray).boxed().collect(Collectors.toList());for(int i =0; i < n-1; i++){
solutionArray[i]= arr.remove( r.nextInt(arr.size()));// randomize base on size}
solutionArray[n-1]= arr.get(0);
L'une des solutions consiste à utiliser la permutation pour pré-calculer toutes les permutations et stockées dans ArrayList
Java 8 a introduit une nouvelle méthode, ints (), dans la classe java.util.Random. La méthode ints () renvoie un flux illimité de valeurs int pseudo-aléatoires. Vous pouvez limiter les nombres aléatoires entre une plage spécifiée en fournissant les valeurs minimale et maximale.
Random genRandom =newRandom();int num = genRandom.nextInt(arr.length);
Avec l'aide de la génération du nombre aléatoire, vous pouvez parcourir la boucle et permuter avec l'index en cours avec le nombre aléatoire. C'est ainsi que vous pouvez générer un nombre aléatoire avec une complexité d'espace O (1).
List<int[]>
entrée contenant une. Voir ma réponse pour savoir comment y parvenir en utilisantCollections.shuffle()
.Réponses:
Utiliser des collections pour mélanger un tableau de types primitifs est un peu exagéré ...
Il est assez simple d'implémenter la fonction vous-même, en utilisant par exemple le shuffle de Fisher – Yates :
la source
println()
place deprintln("")
. Plus clair dans l'intention je pense :)Collections.shuffle(Arrays.asList(array))
ne fonctionne pas, car neArrays.asList(array)
revientCollection<int[]>
pasCollection<Integer>
comme vous le pensiez.Voici une manière simple d'utiliser un
ArrayList
:la source
Collectons.shuffle(Arrays.asList(solutionArray));
Voici une fonction de mélange aléatoire et efficace de Fisher – Yates:
ou
la source
random.nextInt(int bound)
est exclusif mais le donneri + 1
comme argument permettraitindex
eti
pourrait être le même.xor
astuce est idéale pour échanger des registres de CPU lorsque le CPU n'a pas d'instruction de swap et qu'il n'y a pas de registres libres, mais pour échanger des éléments de tableau dans une boucle, je ne vois aucun avantage. Pour les variables locales temporaires, il n'y a aucune raison de les déclarer en dehors de la boucle.temp
variable en dehors de la boucle. L'XOR
astuce devrait être plus rapide que d'utiliser unetemp
variable, mais la seule façon de s'assurer qu'elle effectue un test de référence.La classe Collections a une méthode efficace pour mélanger, qui peut être copiée, afin de ne pas en dépendre:
la source
Arrays.asList
. Vous devez également convertir la liste résultante en tableauArrays.asList()
sur un tableau primitif. Et vous n'auriez pas besoin de le reconvertir car c'est juste un wrapper.Regardez la
Collections
classe en particuliershuffle(...)
.la source
java.util
. Il fait partie de la bibliothèque standard depuis la v1.2.import java.util.Collections; shuffle(solutionArray);
Voici une solution complète utilisant l'
Collections.shuffle
approche:Notez qu'il souffre en raison de l'incapacité de Java à traduire en douceur entre
int[]
etInteger[]
(et doncint[]
etList<Integer>
).la source
Vous avez quelques options ici. Une liste est un peu différente d'un tableau lorsqu'il s'agit de mélanger.
Comme vous pouvez le voir ci-dessous, un tableau est plus rapide qu'une liste et un tableau primitif est plus rapide qu'un tableau d'objets.
Exemples de durées
Ci-dessous, trois implémentations différentes d'un shuffle. Vous ne devez utiliser Collections.shuffle que si vous avez affaire à une collection. Il n'est pas nécessaire d'envelopper votre tableau dans une collection juste pour le trier. Les méthodes ci-dessous sont très simples à mettre en œuvre.
Classe ShuffleUtil
Méthode principale
Mélanger une liste générique
Mélange d'un tableau générique
Mélanger un tableau primitif
Méthodes utilitaires
Méthodes utilitaires simples pour copier et convertir des tableaux en listes et vice-versa.
Classe de plage
Génère une plage de valeurs, similaire à la
range
fonction de Python .la source
range
,toArray
ettoPrimitive
avant tout chronométrage, et boucler pour pouvoir conclure quoi que ce soit (pseudo-code: faire plusieurs fois {générer la liste, arr et iarr; liste de lecture aléatoire; liste de lecture aléatoire arr; liste de lecture aléatoire iarr}). Mes résultats: 1er:list: 36017ns, arr: 28262ns, iarr: 23334ns
. 100:list: 18445ns, arr: 19995ns, iarr: 18657ns
. Cela montre simplement que int [] est pré-optimisé (par code) mais ils sont presque équivalents à l'optimisation d'exécution.L'utilisation
ArrayList<Integer>
peut vous aider à résoudre le problème du brassage sans appliquer beaucoup de logique et consommer moins de temps. Voici ce que je propose:la source
Le code suivant réalisera un ordre aléatoire sur le tableau.
à partir de: http://www.programcreek.com/2012/02/java-method-to-shuffle-an-int-array-with-random-order/
la source
Vous pouvez utiliser java 8 maintenant:
la source
list
et la référence soudainecardsList
. Mais comme vous devez créer le temporairelist
, que vous avez omis, l'Collections.shuffle(Arrays.asList(arr));
approche présentée à plusieurs reprises ici ne présente aucun avantage . Qui fonctionne également depuis Java2.Voici une version générique pour les tableaux:
Étant donné que ArrayList n'est fondamentalement qu'un tableau, il peut être conseillé de travailler avec un ArrayList au lieu du tableau explicite et d'utiliser Collections.shuffle (). Cependant, les tests de performances ne montrent aucune différence significative entre ce qui précède et Collections.sort ():
L'implémentation d'Apache Commons MathArrays.shuffle est limitée à int [] et la pénalité de performance est probablement due au générateur de nombres aléatoires utilisé.
la source
new JDKRandomGenerator()
àMathArrays.shuffle
. Je me demande comment cela affecte la performance?MathArrays#shuffle
a une allocation dans sa boucle de base:int targetIdx = new UniformIntegerDistribution(rng, start, i).sample();
. Bizarre.Par ailleurs, j'ai remarqué que ce code renvoie un
ar.length - 1
certain nombre d'éléments, donc si votre tableau a 5 éléments, le nouveau tableau mélangé aura 4 éléments. Cela se produit car la boucle for indiquei>0
. Si vous passez ài>=0
, tous les éléments sont mélangés.la source
i>0
ài>=0
, vous perdez du temps en échangeant l'élément0
avec lui-même.Voici une solution utilisant Apache Commons Math 3.x (pour les tableaux int [] uniquement):
http://commons.apache.org/proper/commons-math/javadocs/api-3.6.1/org/apache/commons/math3/util/MathArrays.html#shuffle (int [])
Alternativement, Apache Commons Lang 3.6 a introduit de nouvelles méthodes de lecture aléatoire dans la
ArrayUtils
classe (pour les objets et tout type primitif).http://commons.apache.org/proper/commons-lang/javadocs/api-release/org/apache/commons/lang3/ArrayUtils.html#shuffle-int:A-
la source
J'ai vu des informations manquantes dans certaines réponses, j'ai donc décidé d'en ajouter une nouvelle.
Collections Java Arrays.asList prend var-arg de type T
(T ...)
. Si vous passez un tableau primitif (int array), la méthode asList déduira et générera unList<int[]>
, qui est une liste à un élément (le premier élément est le tableau primitif). si vous mélangez cette liste d'éléments, cela ne changera rien.Donc, vous devez d'abord convertir votre tableau primitif en tableau d'objets Wrapper. pour cela, vous pouvez utiliser la
ArrayUtils.toObject
méthode de apache.commons.lang. puis passez le tableau généré à une liste et mélangez-le finalement.la source
Voici une autre façon de mélanger une liste
Choisissez un nombre aléatoire dans la liste d'origine et enregistrez-le dans une autre liste. Supprimez ensuite le numéro de la liste d'origine. La taille de la liste d'origine continuera de diminuer d'une unité jusqu'à ce que tous les éléments soient déplacés vers la nouvelle liste.
la source
Une solution simple pour Groovy:
Cela triera tous les éléments de la liste de tableaux de manière aléatoire, ce qui archivera le résultat souhaité de mélanger tous les éléments.
la source
Utiliser Guava
Ints.asList()
est aussi simple que:la source
Je me penche sur cette question très populaire parce que personne n'a écrit une version à lecture aléatoire. Le style est largement emprunté à
Arrays.java
, car qui ne pille pas la technologie Java de nos jours? Générique etint
implémentations inclus.la source
Il s'agit de l'algorithme de lecture aléatoire de knuth.
la source
Il y a une autre façon aussi, pas encore de poster
de cette façon plus facile, en fonction du contexte
la source
La solution la plus simple pour ce mélange aléatoire dans un tableau.
la source
int[]
àInteger[]
Arrays.asList
méthodeMélanger avec
Collections.shuffle
méthodela source
Code le plus simple à mélanger:
la source
Utilisation de la classe aléatoire
la source
la source
la source
similaire sans utiliser swap b
la source
L'une des solutions consiste à utiliser la permutation pour pré-calculer toutes les permutations et stockées dans ArrayList
Java 8 a introduit une nouvelle méthode, ints (), dans la classe java.util.Random. La méthode ints () renvoie un flux illimité de valeurs int pseudo-aléatoires. Vous pouvez limiter les nombres aléatoires entre une plage spécifiée en fournissant les valeurs minimale et maximale.
Avec l'aide de la génération du nombre aléatoire, vous pouvez parcourir la boucle et permuter avec l'index en cours avec le nombre aléatoire. C'est ainsi que vous pouvez générer un nombre aléatoire avec une complexité d'espace O (1).
la source
Sans solution aléatoire:
la source