2011-04-15 20 views
31

Duplicar posibles:
How to generate a random String in JavaCómo generar una cadena aleatoria de 20 caracteres

Estoy queriendo generar una cadena aleatoria de 20 caracteres sin utilizar clases de Apache. Realmente no me importa si es alfanumérico o no. Además, voy a convertirlo en una matriz de bytes más tarde, para tu información.

Gracias,

+3

Ok. Entonces, ¿qué has intentado ya? –

+2

En una línea: UUID.randomUUID(). ToString(). Replace ("-", ""). Subserie (0,20) – Nolf

+2

Estos 3 códigos de una sola línea son muy útiles, supongo .. 'Long.toHexString (Double.doubleToLongBits (Math.random())); ' ' UUID.randomUUID(). ToString(); ' ' RandomStringUtils.randomAlphanumeric (20); ' – Manindar

Respuesta

81

Aquí tienes. Simplemente especifique los caracteres que desea permitir en la primera línea.

char[] chars = "abcdefghijklmnopqrstuvwxyz".toCharArray(); 
StringBuilder sb = new StringBuilder(20); 
Random random = new Random(); 
for (int i = 0; i < 20; i++) { 
    char c = chars[random.nextInt(chars.length)]; 
    sb.append(c); 
} 
String output = sb.toString(); 
System.out.println(output); 
+1

este no es un buen método ... intenté cien números al azar pero muy pocos fueron únicos. Puse este código en un ciclo while e itere de 0 a 99. Muchas salidas se repitieron .. – Nikhil

+0

@Nikhil Sospecho que hiciste algo mal. Si necesita una mejor fuente de números aleatorios, intente con 'SecureRandom' en su lugar. Eso no debería importar para los duplicados en este caso, sin embargo, al pasar el código anterior obtuve estas 100 cadenas únicas: http://pastebin.com/ELZ950tk – WhiteFang34

+0

@ WhiteFang34 Hola, probé este código en un MIDlet. Supongo que esto podría estar funcionando bien en una aplicación Java de escritorio. Puede consultar mis resultados aquí: http: //pastebin.com/yDcT41g8. Entonces, cuando lo usa en un MIDlet, obtiene cadenas repetidas. El único cambio que hice fue usar StringBuffer en lugar de StringBuilder. – Nikhil

11

que haría uso de este enfoque:

String randomString(final int length) { 
    Random r = new Random(); // perhaps make it a class variable so you don't make a new one every time 
    StringBuilder sb = new StringBuilder(); 
    for(int i = 0; i < length; i++) { 
     char c = (char)(r.nextInt((int)(Character.MAX_VALUE))); 
     sb.append(c); 
    } 
    return sb.toString(); 
} 

Si quieres un byte [] se puede hacer esto:

byte[] randomByteString(final int length) { 
    Random r = new Random(); 
    byte[] result = new byte[length]; 
    for(int i = 0; i < length; i++) { 
     result[i] = r.nextByte(); 
    } 
    return result; 
} 

O usted podría hacer esto

byte[] randomByteString(final int length) { 
    Random r = new Random(); 
    StringBuilder sb = new StringBuilder(); 
    for(int i = 0; i < length; i++) { 
     char c = (char)(r.nextInt((int)(Character.MAX_VALUE))); 
     sb.append(c); 
    } 
    return sb.toString().getBytes(); 
} 
3
public String randomString(String chars, int length) { 
    Random rand = new Random(); 
    StringBuilder buf = new StringBuilder(); 
    for (int i=0; i<length; i++) { 
    buf.append(chars.charAt(rand.nextInt(chars.length()))); 
    } 
    return buf.toString(); 
} 
5

Usted puede utilizar el método de java.util.Random clase con

char c = (char)(rnd.nextInt(128-32))+32 

20x para obtener bytes, que se interpretan como ASCII. Si estás bien con ASCII.

32 es el desplazamiento, desde donde los caracteres son imprimibles en general.

Cuestiones relacionadas