Este es el método SDK que está buscando Collections.shuffle (Arrays.asList (array));
Louis Hong
2
@Louie No, eso no funciona. Eso crearía una List<int[]>entrada que contenga una. Vea mi respuesta para saber cómo lograr esto usando Collections.shuffle().
Duncan Jones
2
No es realmente una respuesta a la pregunta original, pero MathArrays.shuffle de la biblioteca commons-math3 hace el trabajo.
sandris
1
Esto no es lo suficientemente sobre el tema como para justificar una respuesta, pero recuerdo un artículo realmente genial del libro "Graphics Gems" que hablaba de atravesar una matriz en orden pseudoaleatorio. En mi opinión, es mejor tener que barajar los datos en primer lugar. La implementación C se encuentra aquí github.com/erich666/GraphicsGems/blob/master/gems/Dissolve.c
Usar Colecciones para barajar una variedad de tipos primitivos es un poco exagerado ...
Es bastante simple implementar la función usted mismo, usando, por ejemplo, el 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 extremadamente trivial, pero puedes usarlo en println()lugar de println(""). Más claro en la intención, creo :)
Cowan
55
Sería mucho mejor usar Collections.shuffle (Arrays.asList (array)); luego, barajando tu mismo.
Louis Hong
21
@Louie Collections.shuffle(Arrays.asList(array))no funciona, porque no Arrays.asList(array)regresa como pensabas. Collection<int[]>Collection<Integer>
Adam Stelmaszczyk
15
@exhuma Porque si tiene una matriz de miles o millones de valores primitivos para ordenar, envolver cada uno en un objeto solo para hacer una clasificación es un poco costoso, tanto en la memoria como en la CPU.
PhiLho
14
Este no es el shuffle de Fisher-Yates. Esto se llama Durstenfeld shuffle . El shuffle original de fisher-yates se ejecuta en tiempo O (n ^ 2) que es extremadamente lento.
Pacerier
164
Aquí hay una manera simple de usar un ArrayList:
List<Integer> solution =newArrayList<>();for(int i =1; i <=6; i++){
solution.add(i);}Collections.shuffle(solution);
@Timmos Estás equivocado. Arrays.asList se ajusta alrededor de la matriz original y, de este modo, modificarla modifica la matriz original. Es por eso que no puede agregar o quitar, porque las matrices son de tamaño fijo.
Nand
@Y no estoy seguro de lo que estaba pensando, pero mirando el código fuente, de hecho, el método Arrays.asList crea una ArrayList respaldada por la matriz dada. Gracias por mencionarlo. Eliminé mi comentario anterior (no pude editarlo).
Timmos
100
Aquí hay una función de matriz aleatoria Fisher – Yates que funciona y es eficiente:
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];}}}
o
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;}}
Voté porque necesitaba una solución que no tuviera el alto costo de crear una Colección de enteros
mwk
2
¿La segunda implementación no tiene el potencial de intercambiar con su propio índice? random.nextInt(int bound)es exclusivo, pero darlo i + 1como argumento lo permitiría indexy ipodría ser lo mismo.
bmcentee148
21
@ bmcentee148 El intercambio de un elemento consigo mismo está permitido en un orden aleatorio. No entender esto debilitó el Enigma y ayudó a Alan Turing a descifrarlo. en.wikipedia.org/wiki/…
Ellen Spertus
44
El xortruco es excelente para intercambiar registros de CPU cuando la CPU no tiene instrucciones de intercambio y no hay registros libres, pero para intercambiar elementos de matriz dentro de un bucle, no veo ningún beneficio. Para las variables locales temporales, no hay razón para declararlas fuera del ciclo.
Holger
1
Es un poco más eficiente declarar la tempvariable fuera del ciclo. El XORtruco debería ser más rápido que usar una tempvariable, pero la única forma de asegurarse de que realice una prueba de referencia.
Dan Bray
25
La clase de colecciones tiene un método eficiente para barajar, que se puede copiar para no depender de él:
/**
* 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;}}
para no depender de eso ? Preferiría depender de ello, si eso fuera posible.
shmosel
@shmosel Entonces siéntase libre de usarlo. Asegúrese de importar la clase requerida y de haber convertido la matriz a una lista con Arrays.asList. También debe convertir la lista resultante en una matriz
KitKat
No se puede usar Arrays.asList()en una matriz primitiva. Y no necesitaría convertirlo de nuevo porque es solo un contenedor.
shmosel
13
Mira la Collectionsclase, específicamente shuffle(...).
¿Cómo se usa esta clase de Colecciones en Android? ¿Necesita hacer una importación especial (CRTL SHIFT O no funciona) para usarlo?
Hubert el
@Hubert debería ser parte del paquete java.util. Es parte de la biblioteca estándar desde v1.2.
MauganRa
3
Para que su respuesta sea más autónoma, debe contener un código de ejemplo. IE:import java.util.Collections; shuffle(solutionArray);
Stevoisiak
10
Aquí hay una solución completa usando el Collections.shuffleenfoque:
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);}}
Tenga en cuenta que sufre debido a la incapacidad de Java para traducir sin problemas entre int[]y Integer[](y por lo tanto int[]y List<Integer>).
A continuación, hay tres implementaciones diferentes de un shuffle. Solo debe usar Collections.shuffle si se trata de una colección. No es necesario envolver su matriz en una colección solo para ordenarla. Los siguientes métodos son muy simples de implementar.
No está cronometrando las mismas cosas y está cronometrando cada una solo una vez (luego su orden cuenta y olvida la optimización del tiempo de ejecución). Debe llamar range, toArrayy toPrimitiveantes de cualquier sincronización, y realizar un bucle para poder concluir cualquier cosa (pseudocódigo: hacer varias veces {generar lista, arr y iarr; lista de barajado de tiempo; arr barajar de tiempo; arriar de barajado de tiempo}). Mi resultados: primero: list: 36017ns, arr: 28262ns, iarr: 23334ns. 100a: list: 18445ns, arr: 19995ns, iarr: 18657ns. Simplemente muestra que int [] está optimizado previamente (por código) pero son casi equivalentes con la optimización de tiempo de ejecución.
syme
9
Usar ArrayList<Integer>puede ayudarlo a resolver el problema de barajar sin aplicar mucha lógica y consumir menos tiempo. Esto es lo que sugiero:
ArrayList<Integer> x =newArrayList<Integer>();for(int i=1; i<=add.length(); i++){
x.add(i);}Collections.shuffle(x);
No hay nada específico de Java8 en este código. Esto funciona desde Java2. Bueno, funcionaría, una vez que arregle la inconsistencia entre el primer uso listy la referencia repentina cardsList. Pero dado que necesita crear el temporal list, que ha omitido, no hay ningún beneficio sobre el Collections.shuffle(Arrays.asList(arr));enfoque que se muestra varias veces aquí. Lo que también funciona desde Java2.
Holger
3
Aquí hay una versión genérica para matrices:
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;}}}
Teniendo en cuenta que ArrayList es básicamente solo una matriz, puede ser aconsejable trabajar con una ArrayList en lugar de la matriz explícita y usar Collections.shuffle (). Sin embargo, las pruebas de rendimiento no muestran ninguna diferencia significativa entre lo anterior y 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
La implementación de Apache Commons MathArrays.shuffle está limitada a int [] y la penalización de rendimiento probablemente se deba al generador de números aleatorios que se está utilizando.
Parece que se puede pasar new JDKRandomGenerator()a MathArrays.shuffle. Me pregunto cómo afecta eso al rendimiento.
Brandon
En realidad ... parece que MathArrays#shuffletiene una asignación en su bucle principal: int targetIdx = new UniformIntegerDistribution(rng, start, i).sample();. Extraño.
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;}
Por cierto, he notado que este código devuelve una ar.length - 1serie de elementos, por lo que si su matriz tiene 5 elementos, la nueva matriz aleatoria tendrá 4 elementos. Esto sucede porque el bucle for dice i>0. Si cambia a i>=0, obtiene todos los elementos barajados.
Solo un aviso, es posible que desee mover esto a la sección de comentarios de su pregunta, ya que probablemente se marcará si se deja como su propia respuesta.
Jason D
1
Esto parece responder a la pregunta, así que no estoy seguro de lo que estás hablando @JasonD
Sumurai8
1
El código es correcto, el comentario es incorrecto. Si cambia i>0a i>=0, pierde tiempo intercambiando elementos 0consigo mismo.
jcsahnwaldt Restablecer Monica
3
Aquí hay una solución que usa Apache Commons Math 3.x (solo para matrices int []):
Vi información faltante en algunas respuestas, así que decidí agregar una nueva.
Java colecciones Arrays.asList toma var-arg del tipo T (T ...). Si pasa una matriz primitiva (int array), el método asList inferirá y generará unList<int[]> , que es una lista de un elemento (el elemento es la matriz primitiva). si barajas esta lista de elementos, no cambiará nada.
Entonces, primero debe convertir su matriz primitiva en una matriz de objetos Wrapper. para esto puede usar el ArrayUtils.toObjectmétodo de apache.commons.lang. luego pasa la matriz generada a una Lista y finalmente baraja eso.
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;}
Elija un número aleatorio de la lista original y guárdelo en otra lista. Luego elimine el número de la lista original. El tamaño de la lista original seguirá disminuyendo en uno hasta que todos los elementos se muevan a la nueva lista.
Estoy sopesando esta pregunta muy popular porque nadie ha escrito una versión de copia aleatoria. El estilo se toma prestado en gran medida Arrays.java, porque ¿quién no está saqueando la tecnología Java en estos días? Genéricos e intimplementaciones incluidas.
/**
* 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;}
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 solución más simple para este Aleatorio aleatorio en una matriz.
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}}
Agregue alguna descripción relacionada con su respuesta.
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);
Una de las soluciones es usar la permutación para precalcular todas las permutaciones y almacenarlas en ArrayList
Java 8 introdujo un nuevo método, ints (), en la clase java.util.Random. El método ints () devuelve una secuencia ilimitada de valores int pseudoaleatorios. Puede limitar los números aleatorios entre un rango específico proporcionando los valores mínimo y máximo.
Random genRandom =newRandom();int num = genRandom.nextInt(arr.length);
Con la ayuda de generar el número aleatorio, puede iterar a través del bucle e intercambiar con el índice actual con el número aleatorio. Así es como puede generar un número aleatorio con complejidad de espacio O (1).
List<int[]>
entrada que contenga una. Vea mi respuesta para saber cómo lograr esto usandoCollections.shuffle()
.Respuestas:
Usar Colecciones para barajar una variedad de tipos primitivos es un poco exagerado ...
Es bastante simple implementar la función usted mismo, usando, por ejemplo, el shuffle de Fisher-Yates :
fuente
println()
lugar deprintln("")
. Más claro en la intención, creo :)Collections.shuffle(Arrays.asList(array))
no funciona, porque noArrays.asList(array)
regresa como pensabas.Collection<int[]>
Collection<Integer>
Aquí hay una manera simple de usar un
ArrayList
:fuente
Collectons.shuffle(Arrays.asList(solutionArray));
Aquí hay una función de matriz aleatoria Fisher – Yates que funciona y es eficiente:
o
fuente
random.nextInt(int bound)
es exclusivo, pero darloi + 1
como argumento lo permitiríaindex
yi
podría ser lo mismo.xor
truco es excelente para intercambiar registros de CPU cuando la CPU no tiene instrucciones de intercambio y no hay registros libres, pero para intercambiar elementos de matriz dentro de un bucle, no veo ningún beneficio. Para las variables locales temporales, no hay razón para declararlas fuera del ciclo.temp
variable fuera del ciclo. ElXOR
truco debería ser más rápido que usar unatemp
variable, pero la única forma de asegurarse de que realice una prueba de referencia.La clase de colecciones tiene un método eficiente para barajar, que se puede copiar para no depender de él:
fuente
Arrays.asList
. También debe convertir la lista resultante en una matrizArrays.asList()
en una matriz primitiva. Y no necesitaría convertirlo de nuevo porque es solo un contenedor.Mira la
Collections
clase, específicamenteshuffle(...)
.fuente
java.util
. Es parte de la biblioteca estándar desde v1.2.import java.util.Collections; shuffle(solutionArray);
Aquí hay una solución completa usando el
Collections.shuffle
enfoque:Tenga en cuenta que sufre debido a la incapacidad de Java para traducir sin problemas entre
int[]
yInteger[]
(y por lo tantoint[]
yList<Integer>
).fuente
Tienes un par de opciones aquí. Una lista es un poco diferente a una matriz cuando se trata de barajar.
Como puede ver a continuación, una matriz es más rápida que una lista, y una matriz primitiva es más rápida que una matriz de objetos.
Duraciones de muestra
A continuación, hay tres implementaciones diferentes de un shuffle. Solo debe usar Collections.shuffle si se trata de una colección. No es necesario envolver su matriz en una colección solo para ordenarla. Los siguientes métodos son muy simples de implementar.
ShuffleUtil Class
Método principal
Barajar una lista genérica
Barajar una matriz genérica
Barajar una matriz primitiva
Métodos de utilidad
Métodos de utilidad simples para copiar y convertir matrices en listas y viceversa.
Rango de clase
Genera un rango de valores, similar a la
range
función de Python .fuente
range
,toArray
ytoPrimitive
antes de cualquier sincronización, y realizar un bucle para poder concluir cualquier cosa (pseudocódigo: hacer varias veces {generar lista, arr y iarr; lista de barajado de tiempo; arr barajar de tiempo; arriar de barajado de tiempo}). Mi resultados: primero:list: 36017ns, arr: 28262ns, iarr: 23334ns
. 100a:list: 18445ns, arr: 19995ns, iarr: 18657ns
. Simplemente muestra que int [] está optimizado previamente (por código) pero son casi equivalentes con la optimización de tiempo de ejecución.Usar
ArrayList<Integer>
puede ayudarlo a resolver el problema de barajar sin aplicar mucha lógica y consumir menos tiempo. Esto es lo que sugiero:fuente
El siguiente código logrará un orden aleatorio en la matriz.
de: http://www.programcreek.com/2012/02/java-method-to-shuffle-an-int-array-with-random-order/
fuente
Puedes usar java 8 ahora:
fuente
list
y la referencia repentinacardsList
. Pero dado que necesita crear el temporallist
, que ha omitido, no hay ningún beneficio sobre elCollections.shuffle(Arrays.asList(arr));
enfoque que se muestra varias veces aquí. Lo que también funciona desde Java2.Aquí hay una versión genérica para matrices:
Teniendo en cuenta que ArrayList es básicamente solo una matriz, puede ser aconsejable trabajar con una ArrayList en lugar de la matriz explícita y usar Collections.shuffle (). Sin embargo, las pruebas de rendimiento no muestran ninguna diferencia significativa entre lo anterior y Collections.sort ():
La implementación de Apache Commons MathArrays.shuffle está limitada a int [] y la penalización de rendimiento probablemente se deba al generador de números aleatorios que se está utilizando.
fuente
new JDKRandomGenerator()
aMathArrays.shuffle
. Me pregunto cómo afecta eso al rendimiento.MathArrays#shuffle
tiene una asignación en su bucle principal:int targetIdx = new UniformIntegerDistribution(rng, start, i).sample();
. Extraño.Por cierto, he notado que este código devuelve una
ar.length - 1
serie de elementos, por lo que si su matriz tiene 5 elementos, la nueva matriz aleatoria tendrá 4 elementos. Esto sucede porque el bucle for dicei>0
. Si cambia ai>=0
, obtiene todos los elementos barajados.fuente
i>0
ai>=0
, pierde tiempo intercambiando elementos0
consigo mismo.Aquí hay una solución que usa Apache Commons Math 3.x (solo para matrices int []):
http://commons.apache.org/proper/commons-math/javadocs/api-3.6.1/org/apache/commons/math3/util/MathArrays.html#shuffle (int [])
Alternativamente, Apache Commons Lang 3.6 introdujo nuevos métodos aleatorios en la
ArrayUtils
clase (para objetos y cualquier tipo primitivo).http://commons.apache.org/proper/commons-lang/javadocs/api-release/org/apache/commons/lang3/ArrayUtils.html#shuffle-int:A-
fuente
Vi información faltante en algunas respuestas, así que decidí agregar una nueva.
Java colecciones Arrays.asList toma var-arg del tipo T
(T ...)
. Si pasa una matriz primitiva (int array), el método asList inferirá y generará unList<int[]>
, que es una lista de un elemento (el elemento es la matriz primitiva). si barajas esta lista de elementos, no cambiará nada.Entonces, primero debe convertir su matriz primitiva en una matriz de objetos Wrapper. para esto puede usar el
ArrayUtils.toObject
método de apache.commons.lang. luego pasa la matriz generada a una Lista y finalmente baraja eso.fuente
Aquí hay otra forma de barajar una lista
Elija un número aleatorio de la lista original y guárdelo en otra lista. Luego elimine el número de la lista original. El tamaño de la lista original seguirá disminuyendo en uno hasta que todos los elementos se muevan a la nueva lista.
fuente
Una solución simple para Groovy:
Esto ordenará todos los elementos de la lista de la matriz al azar, lo que archiva el resultado deseado de barajar todos los elementos.
fuente
Usar guayaba
Ints.asList()
es tan simple como:fuente
Estoy sopesando esta pregunta muy popular porque nadie ha escrito una versión de copia aleatoria. El estilo se toma prestado en gran medida
Arrays.java
, porque ¿quién no está saqueando la tecnología Java en estos días? Genéricos eint
implementaciones incluidas.fuente
Este es el algoritmo de knuth shuffle.
fuente
También hay otra forma, no publicar aún
de esa manera más fácil, dependía del contexto
fuente
La solución más simple para este Aleatorio aleatorio en una matriz.
fuente
int[]
aInteger[]
Arrays.asList
métodoBarajar con
Collections.shuffle
métodofuente
El código más simple para barajar:
fuente
Usando la clase aleatoria
fuente
fuente
fuente
similar sin usar swap b
fuente
Una de las soluciones es usar la permutación para precalcular todas las permutaciones y almacenarlas en ArrayList
Java 8 introdujo un nuevo método, ints (), en la clase java.util.Random. El método ints () devuelve una secuencia ilimitada de valores int pseudoaleatorios. Puede limitar los números aleatorios entre un rango específico proporcionando los valores mínimo y máximo.
Con la ayuda de generar el número aleatorio, puede iterar a través del bucle e intercambiar con el índice actual con el número aleatorio. Así es como puede generar un número aleatorio con complejidad de espacio O (1).
fuente
Sin solución aleatoria:
fuente