2009-09-19 7 views
6

Estoy usando la función random()% x para la generación de un número aleatorio, pero cada vez que inicio la aplicación veo que crea o genera el mismo número .iPhone: la función random() me da el mismo número aleatorio cada vez

Me gusta Estoy colocando algunas imágenes al azar en función de ese número aleatorio y veo que todas las imágenes se colocan en el mismo lugar sin importar cuántas veces ejecute la aplicación.

+1

Esto parece ser un duplicado de esta pregunta: http://stackoverflow.com/questions/1436217/generating-random-values-in-iphone –

Respuesta

16

Es probable que tengas mejor suerte con arc4random(), no es necesario que lo siembres explícitamente y parece ser un "mejor" al azar.

2

No olvide que debe inicializar el generador de números aleatorios mediante srandom antes de usarlo, con un valor cambiante como la hora actual.

14

En su delegado aplicación:

- (void) applicationDidFinishLaunching:(UIApplication *)application 
{ 
    srandom(time(NULL)); 

    // ... 

    for (int i = 0; i < 100; i++) { 
     NSLog(@"%d", random()); 
    } 
} 

La razón por la que esto funciona es porque los generadores de números pseudoaleatorios requieren un inicio o simiente valor. Al usar el tiempo, es más probable que obtengas diferentes secuencias de números "aleatorios" en cada ejecución.

Si no especifica un valor de inicialización, se usa la misma inicialización en cada ejecución, lo que produce la misma secuencia. Este suele ser un comportamiento no deseado, pero en algunos casos es útil poder generar la misma secuencia, por ejemplo, para probar algoritmos.

En la mayoría de los casos, querrá especificar un valor inicial que cambiará entre ejecuciones, que es donde la hora actual es útil.

+0

Recomendaría el póster lee algunos números pseudoaleatorios (http://en.wikipedia.org/wiki/Peudorandom_number_generator) para obtener una buena comprensión de por qué el código original se comportó de esa manera. –

+0

'srandomdev()'. –

2

Llame a srandomdev() primero.

srandomdev();
long my_rand = random();

4

Para los novatos que vienen con este post:

La función random() produce una pseudo-random sequence. random() formas te da la misma secuencia pseudoaleatoria cada vez que la usas. Necesita "sembrar" la secuencia para elegir un punto de inicio diferente, de modo que cada vez que lo ejecute parezca diferente. Puede usar la hora del sistema para sembrar (srandom(time(NULL)) o usar la función auxiliar srandomdev().

Experimentar intento:

#include "stdio.h" 

int main(void) { 
    int i; 
    for (i = 0; i < 10; i++) 
     printf("%d\n", random()); 

    return 0; 
} 

Usted siempre obtendrá la misma secuencia, en mi equipo le da:

1804289383 
846930886 
1681692777 
1714636915 
1957747793 
424238335 
719885386 
1649760492 
596516649 
1189641421 

Más lectura:

  • La página del manual al azar para más información. (Ejecutar man random de la terminal.)
0

hace uso de srandom (o el equivalente para su función de números aleatorios de elección), sino también el uso de condicionales alrededor de ella, de modo que si se está depurando, las cosas siempre suceden de la misma manera. También tiendo a poner advertencias NSLog cuando hago cosas así, así que no envío código brian-dead.

#if DEBUG==0 
srandom(time(NULL)); 
#else 
NSLog(@"Debug build: Random numbers are not random!"); 
#endif 

o

if(!debuggingBuild) 
    srandom(time(NULL)); 
else 
    NSLog(@"Debug build: Random numbers are not random!"); 
4

arc4random será mejor solución que rand() o aleatoria(). Ver this.

+0

Gracias por este enlace - función bastante genial. – Micko

Cuestiones relacionadas