[C con Clase] Generación números aleatorios

Steven Davidson srd4121 en njit.edu
Jue Ene 7 02:15:18 CET 2010


Hola Javier,

2010/1/7 Javier Cancio del Busto <sepholin en gmail.com>

> El problema es que tarda en ocasiones un par de segundos en poner la ficha,
> sin semilla explícita lo hace al momento, y no queda presentable que tarde
> uno o dos segundos, ya que puede dar la sensación de que de ha quedado
> colgada la aplicación.
>
> ¿Alguna otra sugerencia? ¿O cómo hacer que al fijar la semilla en la hora
> no tarde tanto?


El problema no se basa en la aleatoriedad del algoritmo usado por las
funciones estándares, sino en el uso de los valores retornados por 'rand()'.
En otras palabras, la forma de escoger las casillas es el problema. Tu
algoritmo se basa en ir sacar números hasta que acierte en una casilla
vacía. Esto puede ser un problema ya que puede tardar varias iteraciones
hasta dar con el número adecuado. Esto es porque no se toma en cuenta los
intentos fallidos anteriores.

La solución que propongo es crear un array de 9 números del 0 al 8. Por
ejemplo,

int indices[9] = { 0, 1, 2, 3, 4, 5, 6, 7, 8 };

Ahora usa 'rand()' para reordenar pseudo-aleatoriamente los números en este
array. El algoritmo puede ser simplemente el intercambiar parejas unas 10
veces, por ejemplo. Obtendríamos algo así,

indices[] <- { 5, 3, 8, 1, 7, 6, 4, 0, 2 }

Ahora usaremos este array de índices en tu algoritmo para escoger
aleatoriamente una casilla. Por ejemplo,

int i=0;
do {
                int casilla = indices[i]; // Se genera una casilla
aleatoria, entre 0 - 8

                if (ocupados[casilla] == 0) // Si esta libre..
                {
                    ...
                   codigo
                   ...
                    fichaFijada=1; // Hemos puesto la ficha, salimos del
bucle
                    ocupados[casilla]=1; // Indicamos que esa casilla ahora
esta ocupada por la maquina

                }
                else i++;
            } while (fichaFijada == 0);

Como puedes ver, si el primer índice no es válido, nos pasamos al segundo, y
así hasta dar con una casilla libre. De esta manera, mantenemos un historial
de los índices escogidos, por así decirlo.


Espero que esto te oriente.

Steven
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20100107/ac4a1a80/attachment.html>


Más información sobre la lista de distribución Cconclase