每当我运行以下程序时,返回的值总是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;
}
Run Code Online (Sandbox Code Playgroud)
在今天和昨天,我已经将程序运行了近百次.
谁能告诉我我做错了什么?
谢谢.
编辑:顺便说一句,如果我将rand()的范围改为13或15,它就可以了.
Sne*_*tel 35
根据维基百科,Apple的MCG随机数生成器中使用的乘数是16807.这可以被7整除,因此后面生成的第一个随机数srand()只有一位熵mod 14(也就是说,它只能取两个值).
他们到达那里是一个糟糕的RNG.但是,一个简单的解决方案就是在之后调用rand()几次srand,并丢弃结果.
我可以使用Xcode 5在Mac OS X 10.9上重现这个问题 - 看起来它实际上可能是一个bug,或者至少是OS X 10.9 上的rand()/ 的限制srand().
我建议你使用arc4random(),它比使用更好rand(),并且不需要你随机化种子:
#include <iostream>
#include <cstdlib>
using namespace std;
int main(int argc, const char * argv[])
{
cout << (arc4random() % 14) << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
测试:
$ 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
$
Run Code Online (Sandbox Code Playgroud)