2011-02-04 18 views
5

Como parte de mi proyecto, necesito crear números aleatorios no repetitivos de 2 o 3 dígitos dando un conjunto de números. No quiero implementar una lista o matriz para eso, ya que debería obtener 1 número aleatorio para cada llamada de función.Números aleatorios no repetitivos

Intenté hacer eso usando la clase SecureRandom de Java. También recibí ayuda de algunos de los sitios, pero estoy atrapado en el medio, ¿podemos mezclar los VALORES y hacerlo? Pero no sé cómo se podría hacer eso. ¿Alguien puede ayudarme?

import java.security.SecureRandom; 
public class RandomNumber { 
private static final RandomNumber rnd= new RandomNumber(); 

    private static final char[] VALUES = new char[] { 
      '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}; 
    private static final SecureRandom srn= new SecureRandom(); 
    public String createID() 
    { 
     byte[] bytes = new byte[3]; 
     srn.nextBytes(bytes); 

    } 
+1

¿Son los dígitos dentro del número que deberían ser no repetitivos o los números resultantes de 2 o 3 dígitos? Tu pregunta arrastrada sugiere lo primero, pero lo último parecería más una tarea de tarea. –

+0

¿No se repiten como en ningún número subsiguiente es el mismo o no se repite globalmente? – biziclop

+0

No..Paul .... Los dígitos dentro del número se pueden repetir ... Pero los números generados para cada llamada deben ser únicos ... (por ejemplo: 331 es posible ... pero 331 no se debe generar en segundo lugar tiempo ...) – vidhya

Respuesta

12

Fisher-yates shuffle algorithm es el camino a seguir. Es eficiente para mezclar. y funciona en tiempo lineal.

aquí es algo

To shuffle an array a of n elements: 
    for i from n − 1 downto 1 do 
     j ← random integer with 0 ≤ j ≤ i 
     exchange a[j] and a[i] 

y el código

for(int i=VALUES.length-1; i>0; i--){ 
      int rand = (int) (Math.random()*i); 
      char temp = VALUES[i]; 
      VALUES[i] = VALUES[rand]; 
      VALUES[rand] = temp; 
    } 
+0

Gracias Manoj ... pero el resultado del programa anterior sería una matriz ... ¿correcto ...? entonces ¿cómo puedo obtener un valor único para cada llamada de función cada vez ...? – vidhya

+0

@vidhya: simplemente ponga todos los ~ 1000 posibles valores en una matriz y barajee. Entonces, todo lo que tiene que hacer es mantener una variable para rastrear cuántos números ha producido hasta ahora y seguir recuperando el siguiente en la matriz mezclada. –

-2

Cuando itera código de Manoj es más probable que cambiar los elementos inferiores de los valores [] en lugar de los superiores. Ej: para i = 9 hay una posibilidad 1/10 de que se intercambie con cualquier miembro de la matriz (incluido él mismo). Entonces, para i = 8 nunca más podemos intercambiar VALUES [9] porque Math.random() * i solo puede abarcar de 0 a 8. Esto significa que los VALUES [9] igualarán los VALUES originales [9] con más frecuencia que cualquier otro otro elemento igualará su elemento respectivo (y así sucesivamente con mayor probabilidad de ser intercambiado a medida que se hace más pequeño).

simplemente me gustaría para corregir la respuesta anterior al no ponderar los elementos de la matriz:

for(int i=0; i <= VALUES.length - 1; i++){ 
     int rand = (int) (Math.random()*(VALUES.length-1)); 
     char temp = VALUES[i]; 
     VALUES[i] = VALUES[rand]; 
     VALUES[rand] = temp; 

Ahora la confusión se realiza veces VALUES.length (o tantas veces como se quiera) y no lo hace favor de cualquier elemento particular de la matriz.

+2

En realidad, su "corrección de errores" presenta un error. Este es un malentendido tan común que incluso se discute [en] (http://en.wikipedia.org/wiki/Fisher-Yates#Implementation_errors) en wikipedia. – meriton