2011-01-19 16 views

Respuesta

17

srand() da a la función aleatoria una nueva semilla , un punto de partida (generalmente los números aleatorios se calculan tomando el número anterior (o la semilla) y luego hacen muchas operaciones en ese número para generar el siguiente).

time(0) da el tiempo en segundos desde la época Unix, que es una buena semilla "impredecible" (se garantiza que su semilla será la misma una vez, a menos que inicie su programa varias veces en el mismo segundo) .

+1

Si es "bastante bueno impredecible" depende de los medios de un atacante. Si es posible adivinar cuándo se generó el número aleatorio, el espacio de los posibles valores iniciales podría ser bastante corto. Así que esta * no * es una forma de generar números aleatorios criptográficamente seguros. Pero srand/rand no es adecuado para esto de todos modos ... – sleske

+0

Cuando dices: "el tiempo (0) da el tiempo en segundos ...", ¿qué quieres decir con esto? ¿Puedes dar un ejemplo de la salida? Gracias. – Simplicity

+0

La época de Unix es el 1 de enero de 1970 00:00:00. 'time (0)' devuelve la cantidad de segundos que han transcurrido desde ese momento. – orlp

3

La función C rand genera números aleatorios utilizando una semilla (al igual que la mayoría de los generadores pseudoaleatorios?).

srand se utiliza para establecer la semilla que va a utilizar el algoritmo de generador aleatorio. El valor devuelto por time (es decir: el segundo actual) generalmente se pasa a dicha función porque es el valor más simple de obtener, que normalmente es diferente entre dos ejecuciones de una aplicación

4

Por lo que recuerdo, hay una ecuación que se usa para generar una secuencia de valores. El siguiente valor está algo influenciado por el valor anterior. Al usar el tiempo, está configurando el valor inicial de la ecuación. Tenga en cuenta que los valores son pseudoaleatorios.

Así, por ejemplo, si haces algo como esto:

 

srand(1); 
srand(1); 
 

se generará la misma secuencia de números. Sin embargo, si lo hace:

 

srand(time(0)); 
srand(time(0) + 1); 
 

Se generarán dos secuencias de números diferentes porque el valor de inicialización es diferente.

+0

@ user489041: solo si haces dos 'srand (tiempo (0))' con una brecha de un segundo en el medio de ellos. –

+1

En el último ejemplo, no es realmente diferente a menos que haya más de 1 segundo entre dos llamadas 'srand'. Eso se cumple si tiene 'srand (tiempo (0))' una vez al comienzo de la aplicación y lo ejecuta muchas veces por segundo (algunos enfoques de scripting, por ejemplo). Puede ser sorprendente a veces – Kos

+0

@Tomalak Gert'kal @ Kos- De acuerdo, ese fue un error desagradable que tuve que encontrar una vez. En el ejemplo, las líneas probablemente se ejecutarán mucho más rápido que un segundo de diferencia. Respuesta actualizada – user489041

2

Hay un article at Wikipedia que ofrece una buena historia y ejemplos de algoritmos utilizados.

La versión corta es que rand() y su tipo son generadores de números pseudoaleatorios. De hecho, en realidad son deterministas — la secuencia de números producidos es siempre la misma. Sin embargo, la secuencia es muy larga y el mecanismo de siembra proporciona un medio para comenzar en un lugar (más o menos) arbitrario en esa secuencia.

Dependiendo de cómo se usarán los números aleatorios, hay una variedad de criterios para evaluar la calidad de un generador pseudoaleatorio. En circunstancias muy simples, quizás todo lo que se necesita es una baja probabilidad de valores repetidos de llamadas consecutivas a rand(). Sin embargo, es probable que desee que los números se ajusten a una distribución estadística particular también. (Hasta donde yo sé, la mayoría de los PRNG producen números distribuidos uniformemente. Sin embargo, existen varias funciones o pueden escribirse fácilmente para transformarlo en una distribución gaussiana o cualquier otra que pueda necesitar.)

Finalmente, cuando la seguridad es una preocupación, quieres un algoritmo que, para todos los propósitos prácticos, sea impredecible. Si un atacante conoce el número generado previamente, no debería poder anticiparse al siguiente.En aplicaciones de muy alta seguridad, se puede usar un generador de números verdaderamente aleatorio; estos se basarían en diversas fuentes externas de aleatoriedad, como la estática de radio, el ruido térmico en un dispositivo de captura de imágenes (tapa del objetivo) u otras fuentes similares. Además, muchos sistemas operativos modernos (incluido Linux) reúnen y almacenan un "conjunto de entropía" de diversas fuentes, como las interacciones de usuario impredecibles y permiten la producción de números aleatorios a partir de eso.

Un error de programación común de personas no acostumbradas a trabajar con generadores pseudoaleatorios es reiniciar antes de cada llamada a rand(). Por supuesto, esto es innecesario y probablemente indeseable. Semilla cada generador solo una vez.

3

en primer lugar, srand & rand es para/desde C, no C++, C++ 0x está introduciendo su propia random number generator classes.

Aparte de eso srand & rand se definen aplicación, sólo necesitan entregar un aleatorio entre 0 y RAND_MAX. En windows es un MWC16/32 básico, que usa TLS para almacenar semillas, srand establece esa semilla, que luego es utilizada por rand para rodar un número pseudo aleatorio.

Por medio de generadores de números aleatorios es bastante terrible, especialmente la versión de Windows.

+0

+1 Buen punto acerca de la seguridad. También tenga en cuenta que al menos en ISO C RAND_MAX puede ser tan pequeño como 32.768, por lo que solo proporciona 15 bits de aleatoriedad, incluso si usa una semilla perfectamente aleatoria ... – sleske

-2
#include "stdio.h" //rmv coding for srand is pure 
#include "conio.h" 
#include "time.h" 

void main() 
{ 

    time_t t; 

    srand(time(0)); 

    for (i = 1; i <= 10; i++) 
     cout << (unsigned) rand() % 1000 - 90 << "\t"; 

    for (i = 1; i <= 10; i++) 
     cout << (char) rand() % 100 - 90 << "\t"; 

    getch(); 

} 
+0

No es una respuesta a la pregunta, ni es válida Código C++. –

Cuestiones relacionadas