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

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

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

// main.cpp
#include <iostream>
#include <random>
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 <iostream>
#include <random>
#include <ctime>
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 <iostream>
#include <random>
#include <ctime>
using std::cout;
using std::ends;

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

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

// main.cpp
#include <iostream>
#include <random>
#include <ctime>
using std::cout;
using std::ends;
using std::endl;

int func()
{
    std::default_random_engine e; 
    std::uniform_int_distribution<unsigned> 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 <iostream>
#include <random>
#include <ctime>
using std::cout;
using std::ends;
using std::endl;

int func()
{
    static std::default_random_engine e; // 数据数引擎静态类型
    std::uniform_int_distribution<unsigned> 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 <iostream>
#include <random>
#include <ctime>
using std::cout;
using std::ends;
using std::endl;

int func()
{
    static std::default_random_engine e; // 数据数引擎静态类型
    std::uniform_real_distribution<double> 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新标准引入的随机数简单介绍,欢迎大家一起交流分享。