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

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Letras aleatorias en una matriz
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Letras aleatorias en una matriz  (Leído 4,235 veces)
LecMHD

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Letras aleatorias en una matriz
« en: 21 Junio 2021, 00:47 am »

Hola, necesito generar una gran cantidad de letras aleatorias en una matriz. El tema es que esas letras no se pueden pisar, es decir, si la posición ya está tomada por otra letra, la letra tiene que buscar otro lugar. ¿Alguno tiene idea de cómo proceder?


« Última modificación: 23 Junio 2021, 02:51 am por LecMHD » En línea

DtxdF

Desconectado Desconectado

Mensajes: 53



Ver Perfil
Re: Letras aleatorias en una matriz
« Respuesta #1 en: 21 Junio 2021, 02:01 am »

Hola @LecMHD

Si no te entendí mal, es lo siguiente:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <errno.h>
  4.  
  5. #define RANDOM_DEV "/dev/random"
  6.  
  7. char abc[] = "abcdefghijklmnopqrstuvwxyz";
  8.  
  9. int
  10. get_random_number()
  11. {
  12.    FILE *stream = fopen(RANDOM_DEV, "rb");
  13.    if (!stream) {
  14.        return -1;
  15.    }
  16.  
  17.    unsigned char buff[1];
  18.    fread(buff, sizeof(buff), sizeof(unsigned char), stream);
  19.  
  20.    fclose(stream);
  21.  
  22.    return (int)(buff[0]);
  23. }
  24.  
  25. void
  26. initialize_abc(char *array, int l)
  27. {
  28.    for (int i = 0; i < l; i++)
  29.        array[i] = -1;
  30. }
  31.  
  32. char *
  33. get_random_abc(char *array, int l)
  34. {
  35.    for (int i = 0; i < l; i++) {
  36.        int rn = get_random_number();
  37.        if (rn == -1 && errno != 0)
  38.            return NULL;
  39.  
  40.        char c = array[i];
  41.        char new_c = abc[rn % (sizeof(abc)-1)];
  42.  
  43.        if (c == new_c) {
  44.            i--;
  45.            continue;
  46.        } else {
  47.            array[i] = new_c;
  48.        }
  49.    }
  50.  
  51.    return array;
  52. }
  53.  
  54. int
  55. main(void)
  56. {
  57.    char array[sizeof(abc)];
  58.  
  59.    initialize_abc(array, sizeof(array));
  60.    get_random_abc(array, sizeof(array));
  61.  
  62.    for (int i = 0; i < sizeof(array); i++)
  63.        putchar(array[i]);
  64.    putchar('\n');
  65.  
  66.    return EXIT_SUCCESS;
  67. }

No es portable, pero creo que da la idea, igualmente lo de "pisar" significa que si la letra está en la posición del arreglo en particular, no es incluya, si no que se genere otra, o al menos, así lo entendí.

~ DtxdF


En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.351


Ver Perfil
Re: Letras aleatorias en una matriz
« Respuesta #2 en: 21 Junio 2021, 16:07 pm »

Citar
1 generar una gran cantidad de letras aleatorias en una matriz.
2 El tema es que esas letras no se pueden pisar,
El punto 1 está reñido con el punto 2. Es decir no queda nada claro, que si generas una 'gran cantidad de letras', pués obivmanete cuado ese número sea tan pequeño como 26, para cumplir el paso 2, el punto 1 deja de cumplrirse y se repiten...

Admitiendo ambas cosas a la vez (aunque creo recordar que ya alguna vez o más ahbré puiesto lo mismo o muy parecido).

Código:
 entero constante MAX_LETRAS = 26
 char bufferChars() = "abc...xyz"  //un array de chars con las 26 letras minusculas, añade si quieres las mayusculas (o remplazaa)
 entero Index = MAX_LETRAS    ' el tamaño

  // Cuando el array está barajado (desordenado), simplemente se recorren en orden...
 // ...y al llegar al final se vuelve a barajar.
 function GetRandomChar
     si (index = MAX_LETRAS)
         Llamada a RandomSort
         indedx =0
     sino
         index +=1
     fin si

     devolver bufferchars(index)
 fin funcion
  
 // batajar el array usando el algoritmo de Fisher-Yates
 funcion RandomSort
     entero index
     char tmp

     bucle para k desde (MAX_LETRAS-1) hasta 1 retrocediendo
         k = random(entre 0 y k)
         tmp = bufferchars(k)  
         bufferchars(k) = bufferchars(index)
         bufferchars(index) = tmp
     siguiente
 fin funcion
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines