Perché rand ()% 7 restituisce sempre 0?

Questo sembra essere un problema davvero strano:

Questo è il mio codice:

#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; } 

Se sostituisco quella linea che dice

 newRandomNumber = rand() % 7 

con

 newRandomNumber = rand() % 8 

tutto funziona perfettamente. Perché è così?

Bene, questo

 int seed; for(seed = 1; seed < 10; seed++) { srand(seed); printf("%4d %16d\n", seed, rand()); } 

stampe

  1 16807 2 33614 3 50421 4 67228 5 84035 6 100842 7 117649 8 134456 9 151263 

il che mi fa pensare che rand() = seed * 16807

Articolo Wikipedia Il generatore congruenziale lineare conferma che CarbonLib utilizza effettivamente Xn + 1 = Xn * 16807 per generare numeri casuali.

Sembra improbabile, ma eseguendo alcuni test, dopo un srand il primo rand sembra essere sempre divisibile per 7, almeno in una variabile di dimensioni int.

In diverse sessioni ho ottenuto 1303562743, 2119476443 e 2120232758, tutte mod 7 a 0.

Il secondo rand() funziona, perché è il secondo rand() . Getta un rand() prima del tuo primo rand() … o meglio ancora, usa un generatore di numeri casuali migliore random o arc4rand se disponibile.

Vedi anche Stack Overflow question Perché is (rand ()% anything) sempre 0 in C ++? .