2012-04-05 11 views
6

Tome el siguiente programa:rand cambia de valor sin cambiar semilla

#include <cstdlib> 
using std::rand; 

#include <iostream> 
using std::cout; 

int main() 
{ 
    cout << rand() << ' ' << rand() << ' ' << rand() << '\n'; 
} 

Debido a rand la producción de los mismos valores, siempre que la semilla no se cambia utilizando srand, esto debería producir tres números idénticos.
p.

567 567 567 

Sin embargo, cuando ejecuto este programa, me da tres valores diferentes.
p.

6334 18467 41 

Cuando se vuelve a compilar y ejecutar el programa, se generan los mismos tres números. ¿No debería tener que usar srand para cambiar la semilla antes de comenzar a obtener resultados diferentes desde rand? ¿Es esto solo mi compilador/implementación tratando de hacerme un favor?

SO: Windows XP
Compilador: GCC 4.6.2
Bibliotecas: MinGW

EDIT: al tratar de utilizar srand, he descubierto que esto es el resultado de una semilla de 1 (lo que supongo se hace por defecto).

+5

+1 para abreviar, complete el programa de ejemplo. +1 para mostrar lo que produce el programa. +1 para mostrar lo que espera que produzca. –

+0

¿Está sugiriendo que el generador de números aleatorios tendría que ser sembrado antes de cada llamada al rand? Eso suena más como un número generado por el usuario que un número generado al azar. –

+0

Si todas las apariencias de 'rand' en una función dieron el mismo resultado, no será de ninguna utilidad. – hjpotter92

Respuesta

4

Cada llamada a rand() siempre generará un número aleatorio diferente.

La semilla realmente determina la secuencia de números aleatorios que se crea. Usar una semilla diferente te dará otros 3 números aleatorios, pero siempre obtendrás esos 3 números para una semilla determinada.

Si desea tener el mismo número varias veces simplemente llame al rand() una vez y guárdelo en una variable.

+2

Las diferentes llamadas a rand() pueden devolver el mismo valor. –

+0

Este fue de hecho el caso. Estaba pensando en que difiera cada llamada en lugar de cada ejecución. De acuerdo, de hecho, una determinada semilla podría generar matemáticamente los mismos tres números. – chris

+1

David, tienes toda la razón, pensé que era lo suficientemente raro como para que no valiera la pena mencionarlo. Debería haber dicho que siempre es (pseudo) aleatorio, ya sea en realidad el mismo número o no. – ThomasG

4

Llamar a rand() varias veces intencionalmente produce un número aleatorio diferente cada vez que lo llame.

A menos que su programa llame a srand() con un valor diferente para cada ejecución, la secuencia será la misma para cada ejecución.

Puede usar srand() con el tiempo para hacer que la secuencia completa sea diferente cada vez. También puede llamar al srand() con un valor conocido para restablecer la secuencia, lo cual es útil para las pruebas.

Consulte la documentación para rand() y srand().

+1

rand() podría devolver el mismo número 3 veces seguidas. –

+0

Ese fue mi problema. Sin embargo, tengo que dar crédito a ThomasG por ser el primero en publicar una respuesta explicando el error en mi proceso de pensamiento. – chris

Cuestiones relacionadas