Rand ()% 14 solo genera los valores 6 o 13

Cada vez que ejecuto el siguiente progtwig, los valores devueltos siempre son 6 o 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; } 

He ejecutado el progtwig cerca de cien veces durante el día de hoy y ayer.

¿Alguien puede decirme lo que estoy haciendo mal?

Gracias.

EDITAR: Por cierto, si cambio el rango de rand () para decir 13 o 15, funciona bien.

Puedo reproducir el problema en Mac OS X 10.9 con Xcode 5 – parece que en realidad podría ser un error, o al menos una limitación con rand() / srand() en OS X 10.9.

Te recomiendo que uses arc4random () , que funciona mucho mejor que rand() , y que no requiere que aleatorices la semilla:

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

Prueba:

 $ 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 , el multiplicador que se usa en el generador de números aleatorios MCG de Apple es 16807. Esto es divisible por 7, por lo que el primer número aleatorio producido después de srand() tendrá solo un bit de mod 14 de entropía mod 14 (es decir, solo puede asumir dos valores).

Es un malvado RNG que tienen allí. Una solución fácil, sin embargo, es simplemente llamar a rand() varias veces después de srand , y descartar los resultados.

rand() % 14 es a menudo un generador de números aleatorios pobre. Probablemente obtendrás mejores resultados con esto

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