由随机数分布类、随机数引擎类组成。

    现在介绍生成整数与浮点数的随机数。

    头文件<random>,使用的随机数引擎类是std::default_random_engine,可通过()调用运算符返回随机数,简单的例子:

// main.cpp#include 
#include 
using std::cout;using std::ends;int main(){    std::default_random_engine e;    for (int i = 0; i < 10; ++i)    {        cout  << e() << ends;    }    return 0;}

    此处有个问题,此处返回的随机数是相同的,因为没有设置种子数。

// main.cpp#include 
#include 
#include 
using std::cout;using std::ends;int main(){    std::default_random_engine e(time(nullptr)); // 设置种子数    for (int i = 0; i < 10; ++i)    {        cout  << e() << ends;    }    return 0;}

    此时可生成不同的随机数,如果在生成随机数之前时差超过1秒则随机率高。同样可通过e.seed(value)设置种子数,种子为整型类型。

    如果要指定范围可使用随机数分布类uniform_int_distribution,该类是模板类,有均匀分布功能:

// main.cpp#include 
#include 
#include 
using std::cout;using std::ends;int main(){    std::default_random_engine e(time(nullptr)); // 设置种子数    std::uniform_int_distribution
 u(0,9); // 设置类型为无符号整型,范围为[0,9]    for (int i = 0; i < 10; ++i)    {        cout  << u(e) << ends;  // 生成0-9的随机数    }    return 0;}

    在以下的例子,随机数是一致的:

// main.cpp#include 
#include 
#include 
using std::cout;using std::ends;using std::endl;int func(){    std::default_random_engine e;     std::uniform_int_distribution
 u(0,9); // 设置类型为无符号整型,范围为[0,9]    for (int i = 0; i < 10; ++i)    {        cout  << u(e) << ends;  // 生成0-9的随机数    }    return 0;}int main(){    for (int i = 0; i < 10; ++i)    {        func();        cout << endl;    }    return 0;}

    因为default_random_engine每次都更新,每次的分布类推动是相似的,因此随机数是一致的,可使用静态类型解决该问题:

// main.cpp#include 
#include 
#include 
using std::cout;using std::ends;using std::endl;int func(){    static std::default_random_engine e; // 数据数引擎静态类型    std::uniform_int_distribution
 u(0,9); // 设置类型为无符号整型,范围为[0,9]    for (int i = 0; i < 10; ++i)    {        cout  << u(e) << ends;  // 生成0-9的随机数    }    return 0;}int main(){    for (int i = 0; i < 10; ++i)    {        func();        cout << endl;    }    return 0;}

    此处是静态类型,因此使用的是同一个随机数引擎静态类型,没有更新同时在分布类里不断推动,则产生的随机数是不同的。

    在上处例子是整型,如果使用浮点类型double、float等则编译错误。产生浮点数随机数,使用随机数分布类uniform_real_distribution,该类是模板类,产生浮点随机数,如果使用整型类型unsigned等会产生编译错误:

// main.cpp#include 
#include 
#include 
using std::cout;using std::ends;using std::endl;int func(){    static std::default_random_engine e; // 数据数引擎静态类型    std::uniform_real_distribution
 u(0,1); // 设置类型为双精度浮点数,范围为[0,1]    for (int i = 0; i < 10; ++i)    {        cout  << u(e) << ends;  // 生成0-9的随机数    }    return 0;}int main(){    for (int i = 0; i < 10; ++i)    {        func();        cout << endl;    }    return 0;}

    使用随机数分布类和随机数引擎类,可使用不同的功能,如均匀分布、正态分布,同时产生整数、浮点数等随机数。

    以上是C++11新标准引入的随机数简单介绍,欢迎大家一起交流分享。