objective-c - randomize - generar numeros aleatorios en c en un rango
¿Por qué rand()% 7 siempre devuelve 0? (2)
Bien, esto
int seed;
for(seed = 1; seed < 10; seed++) {
srand(seed);
printf("%4d %16d/n", seed, rand());
}
huellas dactilares
1 16807
2 33614
3 50421
4 67228
5 84035
6 100842
7 117649
8 134456
9 151263
lo cual me hace pensar que rand() = seed * 16807
Artículo de Wikipedia El generador congruente lineal confirma que CarbonLib utiliza Xn + 1 = Xn * 16807 para generar números aleatorios.
Esto parece ser un problema realmente extraño:
Este es mi código:
#import <Foundation/Foundation.h>
int main (int argc, const char * argv[])
{
@autoreleasepool {
srand((unsigned int)time(NULL));
int newRandomNumber = 0;
newRandomNumber = rand() % 7;
NSLog(@"%d", rand() % 7); //This prints out what I expected
NSLog(@"newRandomNumber = %d", newRandomNumber); // This always prints out 0!
}
return 0;
}
Si reemplazo esa línea que dice
newRandomNumber = rand() % 7
con
newRandomNumber = rand() % 8
todo funciona a la perfección ¿Por qué es ese el caso?
Parece poco probable, pero al ejecutar algunas pruebas, después de un srand el primer rand parece ser divisible por 7, al menos en una variable de tamaño int.
En varias ejecuciones obtuve 1303562743, 2119476443 y 2120232758, todos los cuales mod 7 a 0.
El segundo rand()
funciona, porque es el segundo rand()
. Lanza un rand()
antes de tu primer rand()
... o mejor aún, usa un mejor generador de números random
o arc4rand
si está disponible.
También vea Pregunta de desbordamiento de pila ¿ Por qué es (rand ()% cualquier cosa) siempre 0 en C ++? .