Rand()%14仅生成值6或13

每当我运行下面的程序时,返回的值总是6或13。

#include <iostream> #include <fstream> #include <ctime> #include <cstdlib> 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; } 

今天和昨天我已经跑了近百次了。

谁能告诉我我做错了什么?

谢谢。

编辑:顺便说一句,如果我改变的范围()说,13或15它工作得很好。

我可以用Xcode 5在Mac OS X 10.9上重现问题 – 看起来它可能实际上是一个bug,或者至less是在OS X 10.9上的rand() / srand()限制。

我build议你使用arc4random() ,它比rand()更好,而且不需要随机化种子:

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

testing:

 $ 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 $ 

根据维基百科 ,在苹果的MCG随机数发生器中使用的乘数是16807.这可以被7整除,所以在srand()之后产生的第一个随机数将只有一个熵mod 14位(也就是说,两个值)。

这是一个蹩脚的RNG,他们已经到了那里。 然而,一个简单的解决scheme就是在srand之后几次调用rand() ,并放弃结果。

rand() % 14通常是一个不好的随机数发生器。 你可能会得到更好的结果

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