2012-04-11 7 views
7

que tienen un método en una clase de la siguiente manera ...números aleatorios no tan al azar

class foo{ 
    int bar::randomNum10to50(){ 
     srand (time(NULL)); 
     int random10to50 = rand()%50+10; 
     return random10to50; 
    } 
} 

Sin embargo, cuando la llamo desde main (sólo para comprobar la salida, debido a que no estaba recibiendo el comportamiento de el programa que espera) de esta manera ....

es exactamente el mismo número cada vez que se ejecuta (es decir, 9,9,9,9,9, ....; siguiente ejecución: 43, 43,43,43, .....) No sé qué está pasando mal. El código se ejecuta muy rápido, así que pensé que podría ser el problema, pero no veo por qué no habría una diferencia, incluso ligeramente entre las 20 iteraciones de la misma. ¡Cualquier pensamiento es apreciado! ¡Gracias!

+0

"9,9,9,9,9" era un 'error tipográfico', ¿verdad? Me pregunto porque solo debería obtener resultados en el rango de 10 a 50 .. – jorey

Respuesta

20

es necesario llamar a srand() vez, fuera de la función de distribución al azar. De lo contrario, reinicializar el generador de números aleatorios cada vez con el mismo valor de tiempo exacto, produciendo el mismo valor inicial "aleatorio".

+0

gotch ... gracias! Me siento tonto ahora. –

6

Está llamando al srand() con la misma semilla cada ciclo de iteración, ya que el tiempo en realidad no tiene, um, el tiempo para cambiar. Asegúrate de llamarlo solo una vez y todo debería funcionar.

3

Cody gris ya se dice lo que está haciendo mal aquí, pero aquí hay un ejemplo de hacer esto con el <random> biblioteca:

#include <random> 

std::mt19937 make_seeded_engine() { 
    std::random_device r; 
    std::seed_seq seed{r(), r(), r(), r(), r(), r(), r(), r()}; 
    return std::mt19937(seed); 
} 

class foo { 
    std::mt19937 engine; 

public: 
    foo() : engine(make_seeded_engine()) {} 

    int randomNum10to50(){ 
     return std::uniform_int_distribution<>(10,50)(engine); 
    } 
}; 

foo create; 
for (int i=0; i<20;i++){ 
    cout << create.randomNum10to50() << '\n'; 
} 

Tenga en cuenta que rand()%50 + 10 produce números en el rango de 10 a 59, no 10 a 50. uniform_int_distribution es mejor porque el rango que le da es el rango que obtiene, por lo que es menos probable que lo arruine. También el uso de uniform_int_distribution le da resultados imparciales, mientras que rand()%50+10 tiene un ligero sesgo.


Si usted tiene un compilador con un poco más de apoyo C++ 11 que puede hacer:

class foo{ 
    std::mt19937 engine = make_seeded_engine(); 

public: 
    int randomNum10to50(){ 
     return std::uniform_int_distribution<>(10,50)(engine); 
    } 
}; 
+0

¡agradable! ¡Gracias! Puedo terminar usando eso. Buena información! –

+0

Tenga en cuenta que su compilador tendrá que ser compatible con C++ 11 para hacer esto, de lo contrario, puede usar boost, que es de donde proviene ''. – AJG85

+0

@ AJG85 Sí, usa algo de C++ 11, pero tuve cuidado de limitarlo a lo que es ampliamente compatible. VS11 y gcc tan atrás como 4.5 pueden ejecutar esto. Pero creo que agregaré una versión que use más C++ 11 para limpiarlo un poco ... – bames53