elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Sigue las noticias más importantes de seguridad informática en el Twitter! de elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Java
| | | |-+  Cadena aleatoria de caracteres
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Cadena aleatoria de caracteres  (Leído 4,327 veces)
DaniSM98

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Cadena aleatoria de caracteres
« en: 15 Enero 2018, 09:06 am »

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.


En línea

z3nth10n


Desconectado Desconectado

Mensajes: 1.583


"Jack of all trades, master of none." - Zenthion


Ver Perfil WWW
Cadena aleatoria de caracteres (random shuffling)
« Respuesta #1 en: 15 Enero 2018, 09:54 am »

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.


« Última modificación: 15 Enero 2018, 10:12 am por z3nth10n » En línea


Interesados hablad por Discord.
Eleкtro
Ex-Staff
*
Conectado Conectado

Mensajes: 9.878



Ver Perfil
Re: Cadena aleatoria de caracteres
« Respuesta #2 en: 15 Enero 2018, 10:01 am »


Saludos.
En línea



Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.391


Ver Perfil
Re: Cadena aleatoria de caracteres
« Respuesta #3 en: 15 Enero 2018, 10:08 am »

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

Código:
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...

 
En línea

rub'n


Desconectado Desconectado

Mensajes: 1.217


(e -> λ("live now")); tatuar -> λ("α");


Ver Perfil WWW
Re: Cadena aleatoria de caracteres
« Respuesta #4 en: 21 Enero 2018, 08:22 am »

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

Código
  1. import java.util.ArrayList;
  2. import java.util.Collections;
  3. import java.util.List;
  4.  
  5. public class CaracteresShuffle {
  6.  
  7.    private static final char[] CHR = {'D','A','N','I','E','L'};
  8.  
  9.    public CaracteresShuffle() {
  10.  
  11.        shuffle();
  12.  
  13.    }
  14.  
  15.    private void shuffle() {
  16.        /**
  17.             Llenamos una lista de caracteres
  18.             con tu numbre Daniel para luego pasarla
  19.          como parametro en Collections.shuffle
  20.          */
  21.        List<Character> list = new ArrayList<Character>();
  22.        for(int f = 0; f< CHR.length; f++) {
  23.            list.add(CHR[f]);
  24.        }
  25.  
  26.        /**
  27.             Thread que genera tu nombre sin repetir  cada 1.5seg
  28.          */
  29.        new Thread(() -> {
  30.            try {
  31.                while (true) {
  32.                    //cada iteración invoca el método estático shuffle
  33.                    Collections.shuffle(list);
  34.                    for(Character a : list) {
  35.                        print(a);
  36.                    }
  37.                    print("\n");
  38.                    Thread.sleep(1500);
  39.                }
  40.            }catch (InterruptedException ex) {
  41.            }
  42.        }).start();
  43.    }
  44.  
  45.    static<T> void print(final T s) {System.out.print(s);}
  46.    public static void main(String ...foroElHackerNet) {
  47.        new CaracteresShuffle();
  48.    }
  49. }
  50.  

Aplicando Java 8

Código
  1.  private void shuffle() {
  2.  
  3.        List<Character> lista = IntStream
  4.                .range(0, CHR.length)    //recorremos el array completo
  5.                .mapToObj(i -> CHR[i])  //Wrapper de primitivos char a objetos Character  
  6.                .collect(Collectors.toList());
  7.  
  8.        new Thread(() -> {
  9.            try {
  10.                while (true) {
  11.                    //en cada ciclo invocamos el método statico shuffle
  12.                    Collections.shuffle(lista);
  13.                    lista.forEach(param -> print(param));
  14.                    print("\n");
  15.                    Thread.sleep(1500);
  16.                }
  17.            }catch (InterruptedException ex) {
  18.            }
  19.        }).start();
  20.    }
  21.  

/
« Última modificación: 28 Enero 2018, 07:23 am por rub'n » En línea

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 king
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
cadena de caracteres
Programación C/C++
Ander123 1 2,563 Último mensaje 6 Septiembre 2012, 14:15 pm
por avesudra
Link Aleatorio con cadena Aleatoria
PHP
softer2 1 1,659 Último mensaje 18 Mayo 2014, 00:47 am
por ivancea96
cadena de caracteres
Programación C/C++
brayan 5 2,817 Último mensaje 27 Abril 2017, 18:41 pm
por Fedex15
Cadena de caracteres en C
Programación C/C++
Jurott1 8 3,321 Último mensaje 2 Mayo 2017, 01:33 am
por MAFUS
MOVIDO: Cadena aleatoria de caracteres
Programación General
Eleкtro 0 2,241 Último mensaje 15 Enero 2018, 09:56 am
por Eleкtro
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines