Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: LecMHD en 21 Junio 2021, 00:47 am



Título: Letras aleatorias en una matriz
Publicado por: LecMHD 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?


Título: Re: Letras aleatorias en una matriz
Publicado por: DtxdF 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


Título: Re: Letras aleatorias en una matriz
Publicado por: Serapis 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