Rand ()% 14 gera apenas os valores 6 ou 13

Sempre que executo o programa a seguir, os valores retornados são sempre 6 ou 13.

#include  #include  #include  #include  using namespace std; //void randomLegs(); //void randomPush(); //void randomPull(); //void randomMisc(); int main(int argc, const char * argv[]) { srand(time(NULL)); //randomLegs(); cout << rand() % 14; return 0; } 

Eu corri o programa perto de uma centena de vezes durante hoje e ontem.

Alguém pode me dizer o que estou fazendo errado?

Obrigado.

EDIT: By the way, se eu alterar o intervalo de rand () para dizer 13 ou 15 funciona muito bem.

    Eu posso reproduzir o problema no Mac OS X 10.9 com o Xcode 5 – parece que pode realmente ser um bug, ou pelo menos uma limitação com rand() / srand() no OS X 10.9.

    Eu recomendo que você use arc4random () em vez disso, que funciona muito melhor que rand() , e que não requer que você randomize a semente:

     #include  #include  using namespace std; int main(int argc, const char * argv[]) { cout << (arc4random() % 14) << endl; return 0; } 

    Teste:

     $ g++ -Wall -O3 srand.cpp && ./a.out 5 $ ./a.out 8 $ ./a.out 0 $ ./a.out 8 $ ./a.out 11 $ ./a.out 8 $ ./a.out 3 $ ./a.out 13 $ ./a.out 9 $ 

    Por wikipedia , o multiplicador usado no gerador de números randoms MCG da Apple é 16807. Isso é divisível por 7, então o primeiro número random produzido depois de srand() terá apenas um bit de entropia mod 14 (isto é, ele só pode assumir dois valores).

    É um RNG de baixa qualidade que eles têm lá. Uma solução fácil, no entanto, é apenas chamar rand() algumas vezes logo após srand e descartar os resultados.

    rand() % 14 geralmente é um gerador de números randoms pobre. Você provavelmente obterá melhores resultados com isso

     (int)(14*(rand()/(RAND_MAX + 1.0)))