Letras aleatorias en una matriz

Iniciado por LecMHD, 21 Junio 2021, 00:47 AM

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

LecMHD

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?

DtxdF

Hola @LecMHD

Si no te entendí mal, es lo siguiente:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>

#define RANDOM_DEV "/dev/random"

char abc[] = "abcdefghijklmnopqrstuvwxyz";

int
get_random_number()
{
   FILE *stream = fopen(RANDOM_DEV, "rb");
   if (!stream) {
       return -1;
   }

   unsigned char buff[1];
   fread(buff, sizeof(buff), sizeof(unsigned char), stream);

   fclose(stream);

   return (int)(buff[0]);
}

void
initialize_abc(char *array, int l)
{
   for (int i = 0; i < l; i++)
       array[i] = -1;
}

char *
get_random_abc(char *array, int l)
{
   for (int i = 0; i < l; i++) {
       int rn = get_random_number();
       if (rn == -1 && errno != 0)
           return NULL;

       char c = array[i];
       char new_c = abc[rn % (sizeof(abc)-1)];

       if (c == new_c) {
           i--;
           continue;
       } else {
           array[i] = new_c;
       }
   }
   
   return array;
}

int
main(void)
{
   char array[sizeof(abc)];

   initialize_abc(array, sizeof(array));
   get_random_abc(array, sizeof(array));
   
   for (int i = 0; i < sizeof(array); i++)
       putchar(array[i]);
   putchar('\n');

   return EXIT_SUCCESS;
}


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

Serapis

Citar1 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).


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