¿Te gustaría aprender Lenguaje C/C++?
Tenemos los cursos que necesitas.¡Haz clic aquí!



Probablemente te has dado cuenta de que en C, al usar la función rand() de la biblioteca estándar, se obtienen resultados decepcionantes, y casi siempre los mismos.

Por ejemplo, si queremos generar 5 números aleatorios uno detrás de otro:

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

int main()
{
    int i;
    for(i=0; i<5; i++)
    {
        printf("%d\n", rand());
    }
    return 0;
}

Ejecutamos el programa y obtenemos el siguiente resultado:

41
18467
6334
26500
19169

Notarás que los resultados son bastante diferentes, pero si volvemos a ejecutar el programa, tendremos la misma serie de números.

Para cambiar el comportamiento del generador de números aleatorios, podemos cambiar la variable sobre la que se basa para realizar los cálculos. A esta se le llama seed o semilla.
Esta semilla puede modificarse con la función srand():

srand(valor de la semilla)

Necesitamos elegir un número que no podamos predecir fácilmente y que varíe de un instante a otro. Por ejemplo, puedes usar el número de ciclos utilizados por tu procesador desde el inicio. Puede ser obtenido, en procesadores x86 (Intel, Amd, etc.), con el comando ensamblador rdtsc. La escritura de una función rdtsc() podrá facilitarte las cosas, la sintaxis siguiente funciona con GCC en Linux y la puedes encontrar con dev C++ en Windows:

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

int rdtsc()
{
    __asm__ __volatile__("rdtsc");
}

int main()
{
    int i;
    for(i=0; i<5; i++)
    {
        srand(rdtsc());
        printf("%d\n", rand());
    }
    return 0;
}

Con este código, generarás números aleatorios más eficaces.

Nota: Esta solución funciona únicamente con los procesadores x86.

También evita activar optimizaciones en el compilador (opción-O1,-O2-O3, etc.) cuando utilices la función rdtsc.

Te esperamos en el siguiente articulo en donde hablaremos mas acerca de estos temas, los cuales hoy en día son de vital importancia en el mundo de la tecnología.

¿Te gustaría aprender Lenguaje C/C++?
Tenemos los cursos que necesitas.¡Haz clic aquí!
About Author

NGuerrero

0 0 votos
Article Rating
Suscribir
Notificar de
guest
0 Comments
Comentarios.
Ver todos los comentarios
0
¿Te gusta este articulo? por favor comentax