36 votes

Pourquoi rand() % 7 renvoie-t-il toujours 0 ?

Il s'agit d'un problème vraiment étrange :

Voici mon code :

#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 je remplace la ligne qui dit

newRandomNumber = rand() % 7

avec

newRandomNumber = rand() % 8

tout fonctionne parfaitement. Pourquoi en est-il ainsi ?

36voto

georg Points 52691

Eh bien, cette

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

empreintes

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

ce qui me fait penser que rand() = seed * 16807

Article de Wikipédia _Générateur congruentiel linéaire_ confirme que CarbonLib utilise bien Xn+1 = Xn * 16807 pour générer des nombres aléatoires.

9voto

Grady Player Points 7823

Cela semble peu probable mais en faisant quelques tests, après un srand, le premier rand semble toujours être divisible par 7, au moins dans une variable de taille int.

A plusieurs reprises, j'ai obtenu 1303562743, 2119476443, et 2120232758, qui sont tous des mod 7 à 0.

Le deuxième rand() fonctionne, car il s'agit du deuxième rand() . Lancer un rand() avant votre première rand() ... ou mieux encore, utiliser un meilleur générateur de nombres aléatoires random o arc4rand si elle est disponible.

Voir aussi la question de Stack Overflow Pourquoi (rand() % anything) est-il toujours 0 en C++ ? .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X