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

时间:2013-11-28 10:12:52

标签: c++ random srand

每当我运行以下程序时,返回的值总是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,那就可以了。

3 个答案:

答案 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)))