2008-11-30 5 views
10

Hay mucha información conflictiva sobre este tema. Así que intentemos acordar una respuesta definitiva:C: la verdad definitiva sobre rand, random y arc4random

¿Cuál de estos generadores de números aleatorios en C crea una mejor aleatoriedad: rand, random o arc4random?

nota: Sólo para hacer la pregunta clara, esto no es una pregunta sobre la aleatoriedad real, es sólo un choque entre los 3.


Como se ha señalado, esta pregunta no tiene mucho sentido, ya que no se trata de C, sino de una implementación específica, en mi caso, cocoa (más específicamente, el sdk de iphone, pero supongo que son los mismos en lo que respecta a estas funciones). Aún así, hay información útil aquí. Concluí implementando arc4random, principalmente debido a su facilidad de uso (no se necesita siembra), que es un factor importante que nadie señaló.

Estoy cerrando la pregunta y agregando la etiqueta de cacao para los desarrolladores de cacao que buscan información sobre los RNG. Muchas gracias por los que contribuyeron y disculpen la confusión.

+0

¿Qué pasa con la familia drand48() de PRNGs? Mi evaluación sería 'no en el Estándar C', parte de POSIX/SUS; generalmente mejor que rand; probablemente no sea tan bueno como random() y sus funciones de soporte. –

+0

La pregunta no tiene sentido. Solo rand() es parte del lenguaje C, y el estándar no dice nada sobre cuán aleatorio debería ser o cómo debería implementarse. – jalf

+0

Sí, claramente cometí un error. Debería haber sido reducido al cacao. ¿Y ahora qué? Cambiar el alcance de la pregunta haría las respuestas incómodas.Pero aquí hay información útil para los desarrolladores de cacao, y cerrar la pregunta lo enviaría todo al limbo. ¿Qué hacer? –

Respuesta

23

De estas funciones, solo rand es parte del estándar C. random es parte de POSIX, y arc4random solo se proporciona en BSD (y derivado). Entonces, solo rand está "en C".

Para rand, el estándar C no dice nada sobre la calidad del generador, es decir, devolver siempre el mismo número sería conforme. Dice que el número debe estar entre 0 y RAND_MAX. El valor de RAND_MAX y el algoritmo preciso que se usa están definidos por la implementación (aunque RAND_MAX debe ser al menos 32767).

Para al azar, POSIX specifies que debe tener un período de al menos 2^31 por defecto, y, si se llama a initstate con 256 bytes de estado, entonces debe tener un período de al menos 2^69; otros detalles son nuevamente definidos por la implementación.

Para arc4random, la implementación específica es parte de su definición (RC4). Se especifica que da 2^32 valores diferentes; No pude encontrar nada sobre su período .

Para compararlos en detalle, uno debería saber a qué implementación específica se refiere.

+0

Hola Martin, en mi caso, la implementación es el iphone SDK. ¿Es realmente importante para esta pregunta? ¿Debo editar? Sería mejor si pudiera evitar cambiar el alcance de la pregunta. –

+0

Si el iphone SDK es similar a OSX, entonces la implementación de rand() es de FreeBSD (rand.c 1.15). El algoritmo entonces es de Parker y Miller, "Generadores de números aleatorios: los buenos son difíciles de encontrar". al azar usa el mismo algoritmo si n de initstate es <8; rand ya es un buen algoritmo –

+0

¿El algoritmo arc4random es el mismo en todas las implementaciones? Leí aquí que es lo mejor en cacao: http://iphonedevelopment.blogspot.com/2008/10/random-thoughts-rand-vs-arc4random.html. ¿Cómo se compara en general con los otros 2, en la mayoría de las implementaciones? Tal vez podamos llegar a algún consenso. –

9

La implementación de rand() no está especificada por el estándar C, sin embargo, la mayoría de los compiladores usan un generador congruente lineal. random() y arc4random() tampoco son C estándar, pero son mejores que la implementación habitual de rand()

Diría: arc4random() es mejor que random() es mejor que rand()

rand() es realmente terrible. Sin embargo, puedes hacer mucho mejor que los tres sin embargo.

También depende para qué desee los números aleatorios. Un buen generador de números aleatorios para cifrado/seguridad puede no ser un buen generador de números aleatorios para la simulación y viceversa.

+0

"Yo diría ...". ¿Podrías explicarme por qué? – Spookbuster

Cuestiones relacionadas