每当我运行以下程序时,返回的值总是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;
}
在今天和昨天,我已经将程序运行了近百次。
谁能告诉我我做错了什么?
谢谢。
编辑:顺便说一句,如果我将rand()的范围改为13或15,那就可以了。
答案 0 :(得分:34)
Per wikipedia,Apple的MCG随机数生成器中使用的乘数是16807.这可以被7整除,因此srand()
之后产生的第一个随机数只有一位熵{{ 1}}(也就是说,它只能采用两个值)。
他们到达那里是一个糟糕的RNG。但是,一个简单的解决方案就是在mod 14
之后立即拨打rand()
几次,并弃掉结果。
答案 1 :(得分:8)
我可以使用Xcode 5在Mac OS X 10.9上重现这个问题 - 看起来它实际上可能是一个错误,或者至少是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;
}
测试:
$ 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
$
答案 2 :(得分:3)
rand() % 14
通常是一个糟糕的随机数生成器。你可能会用这个
(int)(14*(rand()/(RAND_MAX + 1.0)))