Generar números aleatorios en matriz

Posible duplicado:
¿Números aleatorios únicos en O (1)?

Soy nuevo en Java. Quiero generar un conjunto de números aleatorios de un conjunto dado y los números tampoco deben repetirse. Por ejemplo, los números posibles son [0,1,2,3] , quiero obtener tres números únicos aleatorios almacenados en una matriz. Ex. [0,2,1], [2,3,1], [0,3,2] etc.

Necesitas una mezcla de Fisher-Yates.

Se trata de una solución “select n from m” muy eficiente que le ofrece un subconjunto de sus valores con cero posibilidad de duplicados (y ninguna clasificación inicial innecesaria). Pseudo-código para hacer esto sigue:

 dim n[N] // gives n[0] through n[N-1] for each i in 0..N-1: n[i] = i // initialise them to their indexes nsize = N // starting pool size do N times: i = rnd(nsize) // give a number between 0 and nsize-1 print n[i] nsize = nsize - 1 // these two lines effectively remove the used number n[i] = n[nsize] 

Simplemente seleccionando un número aleatorio del grupo (basado en el tamaño del grupo actual), reemplazándolo con el número superior de ese grupo, luego reduciendo el tamaño del grupo, se obtiene un orden aleatorio sin tener que preocuparse por una gran cantidad de swaps. en la delantera.

Esto es importante si el número es alto ya que no introduce un retraso de arranque innecesario.

Por ejemplo, examine la siguiente verificación de banco, eligiendo 10 de 10:

 <------ n[] ------> 0 1 2 3 4 5 6 7 8 9 nsize rnd(nsize) output ------------------- ----- ---------- ------ 0 1 2 3 4 5 6 7 8 9 10 4 4 0 1 2 3 9 5 6 7 8 9 7 7 0 1 2 3 9 5 6 8 8 2 2 0 1 8 3 9 5 6 7 6 6 0 1 8 3 9 5 6 0 0 5 1 8 3 9 5 2 8 5 1 9 3 4 1 1 5 3 9 3 0 5 9 3 2 1 3 9 1 0 9 

Puede ver que la agrupación se reduce a medida que avanza y, como siempre está reemplazando la utilizada por una no utilizada, nunca tendrá una repetición.


Aquí hay un pequeño progtwig de Java que muestra esto en acción:

 import java.util.Random; public class testprog { private int[] pool; // The pool of numbers. private int size; // The current "size". private Random rnd; // A random number generator. // Constructor: just initilise the pool. public testprog (int sz) { pool = new int[sz]; size = sz; rnd = new Random(); for (int i = 0; i < size; i++) pool[i] = i; } // Get next random number in pool (or -1 if exhausted). public int next() { if (size < 1) return -1; int idx = rnd.nextInt(size--); int rval = pool[idx]; pool[idx] = pool[size]; return rval; } // Test program for the pool. public static void main(String[] args) { testprog tp = new testprog (10); for (int i = 0; i < 11; i++) System.out.println (tp.next()); } } 

La salida es (para una ejecución en particular):

 3 5 1 0 6 4 9 2 8 7 -1 

El -1 está ahí solo para mostrarte lo que sucede cuando agotas la lista. Como ha declarado explícitamente que no desea duplicados, devuelve un valor centinela. También puede elegir otras opciones, como lanzar una excepción o simplemente reiniciar el grupo.