Cadena aleatoria de caracteres

Iniciado por DaniSM98, 15 Enero 2018, 09:06 AM

0 Miembros y 1 Visitante están viendo este tema.

DaniSM98

Hola buenas, tengo este código:

char[] chr={'d','a','n','i','e','l'};
      char[] aleatorio=new char[6];

      for(int i=0;i<=5;i++){
         aleatorio=chr[(int)(Math.random()*6)];
         System.out.print(aleatorio);

De esta manera, me devuelve una cadena de 6 caracteres totalmente aleatoria, repitiendo algunos caracteres, ¿qué podría añadir para que en el resultado no se repitiera ningún caracter?

Gracias, un saludo.

z3nth10n

#1
En vez de iterar sobre la array lo que deberías hacerle es un Shuffle, es decir, barajar el array...

https://stackoverflow.com/questions/14720134/is-it-possible-to-random-shuffle-an-array-of-int-elements

Como te dicen aquí, perdón, por no publicar yo mismo una respuesta (no manejo mucho de C++), con la librería "<algorithm>" puedes llamar al método random_shuffle. (El problema no tiene que ver con lo tuyo, simplemente es un problema de punteros, pero me sirve de ejemplo)

EDIT: Acabo de leer el comentario de Elektro, es Java, cierto, bueno, la idea es la misma, es usar random shuffling, tanto su propuesta como por ejemplo, puede ser esta:

https://stackoverflow.com/a/43892363/3286975

Básicamente, sugiere usar el metodo shuffle de la clase Collections que forma parte del paquete java.util.Collections.

Más info: https://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#shuffle(java.util.List)

PD: Aunque haya metido la gamba, dejo la opción en C++ para el que necesite info para saber como se hace.

Un saludo.

Interesados hablad por Discord.


Serapis

Remplazanso el que ha salido, por el último y reduciendo el bucle...


array chr
char c
entero j, k

Bucle para k desde 5 hasta 1 retrocediendo
    j = random(ente 0 y k)
    c = chr(n)
    imprimir c   
    // ´de aquí para arriba lo que tienes
    // de aquí para bajo, el remplazo...
    chr(j)= chr(k)
    chr(k) = c
fin bucle
imprimir chr


Al inicio tienes DANIEL
Al empezar se elige entre 0 y 5, supongamos que sale el 2 (la 'N')
la imprimes, luego la remplazas por el carácter en ese ciclo ( el máximo elegible)

entonces ahora te queda: DALIE'N
y ahora en el siguiente ciclo ( el 4) eliges entre 0 y 4, luego ya no sale repetido la 'N', aunque sí salga repetido el valor 2, pero ahora su contenido es otro...
supongamos que ahora sale el 0... la 'D'... se remplaza por el último valor visitable (como estamso en el ciclo 4, el carácter en ese índice es la 'E'

ahora queda así: EALI'DN  el apóstrofo es para indicar la separación entre los elegibles y los ya elegidos en ciclos pasados.
ahora en el cilo 3 toca elegir entre 0 y3, supongamos que sal eel 2, la letra 'L'
nuevamente la remplazamos por la última elegible (la 3), la I

ahora nos queda así: EAI'LDN
toca el ciclo 2, supongmaos que sale el 1, letra A
hacmeos el intercambio la que sale por la última elegible del ciclo, A por I,

ahora nos queda así: EI'ALDN
toca el cliclo 1, pongamos que sale el 0, la 'E'
remplazamos el que sale por el último elegible, la E por la I

finalmente nos queda así: I'EALDN
es estéril elegir para el bucle 0, no hay elección si solo se puede elegir, 1, por eso el bucle acaba en el 1 y no en el 0.

El array al final contiene: IEALDN, exactamente están en orden inverso a como han salido, luego estamos reusando el mismo array de la entrada para la salida (si esto es aceptable, si no debe hacerse copia del array en la entrada, mejor en la llamada).

-----------------------
Dejo a tu esfuerzo y capacidad, modificar el pseudocódigo, para que al final del bucle (sin ninguna operación posterior) te quede el array ordenado correctamente en el mismo orden en que han ido saliendo...


rub'n

#4
Interesante hacerlo   ;D con los tips de los muchachos , y de verdad que no se repiten  :D

Código (java) [Seleccionar]
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class CaracteresShuffle {

   private static final char[] CHR = {'D','A','N','I','E','L'};

   public CaracteresShuffle() {

       shuffle();

   }

   private void shuffle() {
       /**
           Llenamos una lista de caracteres
           con tu numbre Daniel para luego pasarla
        como parametro en Collections.shuffle
        */
       List<Character> list = new ArrayList<Character>();
       for(int f = 0; f< CHR.length; f++) {
           list.add(CHR[f]);
       }

       /**
           Thread que genera tu nombre sin repetir  cada 1.5seg
        */
       new Thread(() -> {
           try {
               while (true) {
                   //cada iteración invoca el método estático shuffle
                   Collections.shuffle(list);
                   for(Character a : list) {
                       print(a);
                   }
                   print("\n");
                   Thread.sleep(1500);
               }
           }catch (InterruptedException ex) {
           }
       }).start();
   }

   static<T> void print(final T s) {System.out.print(s);}
   public static void main(String ...foroElHackerNet) {
       new CaracteresShuffle();
   }
}


Aplicando Java 8

Código (java) [Seleccionar]

 private void shuffle() {

       List<Character> lista = IntStream
               .range(0, CHR.length)    //recorremos el array completo
               .mapToObj(i -> CHR[i])  //Wrapper de primitivos char a objetos Character 
               .collect(Collectors.toList());
       
       new Thread(() -> {
           try {
               while (true) {
                   //en cada ciclo invocamos el método statico shuffle
                   Collections.shuffle(lista);
                   lista.forEach(param -> print(param));
                   print("\n");
                   Thread.sleep(1500);
               }
           }catch (InterruptedException ex) {
           }
       }).start();
   }


/


rubn0x52.com KNOWLEDGE  SHOULD BE FREE!!!
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen