¿Por qué rand ()% 7 siempre devuelve 0?

Esto parece ser un problema realmente extraño:

Este es mi código:

#import  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?

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.

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 stack ¿ Por qué es (rand ()% cualquier cosa) siempre 0 en C ++? .