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