C++中用rand()和srand()产生随机数介绍

来源:互联网 发布:linux启动jenkins 编辑:程序博客网 时间:2024/06/06 04:45

C++中提供两个用来帮助产生伪随机数的函数——rand()函数和srand()函数。
二者均包含在标准库<cstdlib>中。

RAND_MAX

RAND_MAX是一个在标准库<cstdlib>中定义的宏,表示伪随机生成函数rand()所能返回的最大数值。
ISO IEC 9899 2011(C++11)标准中未规定 RAND_MAX 的具体数值。但该标准规定了RAND_MAX 的值应至少为32767。编程的时候,不应该对 RAND_MAX 的具体数值做任何假设。

rand()函数

函数原型:int rand();
函数描述:以srand(seed)中的seed作为发生器,返回一个[0, RAND_MAX](包括0和RAND_MAX)间的伪随机整数。
函数说明:rand()函数用来产生随机数,不过需要调用srand()的seed值来初始化伪随机数产生器。

srand()函数

函数原型:void srand(unsigned seed);
函数描述:用值seed来初始化rand()使用的伪随机数产生器。
函数说明:如果rand()使用之前没有调用过srand(),则默认为调用srand(1),每次用srand()初始化后的rand()都产生相同次序的相同值。

举例

以上概念比较难理解,其实就是产生随机数同时需要rand()和srand(),srand()相当于一个发生器,要产生随机数,首先必须要有一个发生器,可以自己定义srand()的参数seed,未定义时默认为1,即srand(1),有了发生器,才能使用rand()产生随机数。

例一,直接调用rand():

#include <iostream>#include <cstdlib>using namespace std;int main(){    cout << "RAND_MAX is: " << RAND_MAX <<endl;    cout << "ten  pseudo-random number:" <<endl;    for(int i = 0; i < 10; i++)    {        cout << rand() << " ";    }    return 0;}

输出:
这里写图片描述

函数首先输出RAND_MAX的值,然后输出十个rand()产生的随机数,要注意的是,每次执行,生成的随机数都跟上次相同。

例二,使用rand() % (int)n,产生[0, n)之间的伪随机数:

#include <iostream>#include <cstdlib>using namespace std;int main(){    cout << "RAND_MAX is: " << RAND_MAX <<endl;    cout << "ten pseudo-random number:" <<endl;    for(int i = 0; i < 10; i++)    {        cout << rand() % 10 << " ";    }    return 0;}

输出:
这里写图片描述

这次输出[0, 10)(不包括10)之间的伪随机数,每次产生的数值同样相同。

例三,指定seed为定值1:

#include <iostream>#include <cstdlib>using namespace std;int main(){    srand(1);    cout << "RAND_MAX is: " << RAND_MAX <<endl;    cout << "ten pseudo-random number:" <<endl;    for(int i = 0; i < 10; i++)    {        cout << rand() % 10 << " ";    }    return 0;}

输出:
这里写图片描述

前两个例子未直接指定srand()的seed参数,均使用了seed的默认值1,现在显式指定seed值为1,输出结果与未指定seed值相同,由此印证了seed的默认值为1,且每次产生的数值均相同。

例四,指定seed为非1整数:

#include <iostream>#include <cstdlib>using namespace std;int main(){    srand(10);    cout << "RAND_MAX is: " << RAND_MAX <<endl;    cout << "ten pseudo-random number:" <<endl;    for(int i = 0; i < 10; i++)    {        cout << rand() % 10 << " ";    }    return 0;}

输出:
这里写图片描述

当指定不同的seed值时,产生的随机数不同,但多次执行(相同seed值)产生的随机数相同。

例五,指定seed为系统时间或进程识别码:

#include <iostream>#include <cstdlib>#include <ctime>using namespace std;int main(){    srand((unsigned)time(0));    //srand((unsigned)getpid());    cout << "RAND_MAX is: " << RAND_MAX <<endl;    cout << "ten pseudo-random number:" <<endl;    int n = 3;    while(n)    {        for(int i = 0; i < 10; i++)            cout << rand() % 10 << " ";        cout << endl;        n--;    }    return 0;}

输出:
这里写图片描述

当使用系统时间time(0)或者进程识别码getpid()作为seed值时,因为他们是一个持续变化的值,所以每次执行相当于seed值一直在刷新,导致每次产生的随机值均不同

补充

1,要产生[a, b)之间的随机整数,有一个通用的公式:( rand() % (b - a) ) + a(结果包括a不包括b)。

#include <iostream>#include <cstdlib>#include <ctime>using namespace std;int main(){    //srand((unsigned)time(0));    srand((unsigned)getpid());    cout << "RAND_MAX is: " << RAND_MAX <<endl;    cout << "ten pseudo-random number:" <<endl;    int n = 3;    int a = 10;    int b = 20;    while(n)    {        for(int i = 0; i < 10; i++)            cout << rand() % (b - a) + a << " ";        cout << endl;        n--;    }    return 0;}

输出:
这里写图片描述

测试代码产生10到20之间的随机数。
这里无论a、b是正数还是负数均适用,特殊的,当a = 0时简写为rand() % b。

2,考虑伪随机浮点数,rand() / double(RAND_MAX)可以取得0~1之间的浮点数。

#include <iostream>#include <cstdlib>#include <ctime>using namespace std;int main(){    //srand((unsigned)time(0));    srand((unsigned)getpid());    cout << "RAND_MAX is: " << RAND_MAX <<endl;    cout << "ten pseudo-random number:" <<endl;    int n = 3;    while(n)    {        for(int i = 0; i < 8; i++)            cout << rand() / (double)RAND_MAX << " ";        cout << endl;        n--;    }    return 0;}

产生(0, 1)之间的随机浮点数。
如果想取更大的浮点数,比如(1, 10)、(10, 100)…等,可以直接在产生的浮点数后面乘以10、乘以100等,这只是一个取巧的方法,实际上不是一个严谨的取随机数方式。不过鉴于大部分用到随机浮点数均为(0, 1),所以就不深究具体的产生大数值的随机浮点数了。。

参考链接:
C++中用rand()和srand()产生为随机数方法介绍
C/C++产生随机数

原创粉丝点击