前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >C++ 随机数

C++ 随机数

作者头像
学徒漠筱歌
发布于 2022-07-17 02:28:40
发布于 2022-07-17 02:28:40
61400
代码可运行
举报
文章被收录于专栏:ZMHZMH
运行总次数:0
代码可运行

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

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 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;
}

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 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,该类是模板类,有均匀分布功能:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 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;
}

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 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每次都更新,每次的分布类推动是相似的,因此随机数是一致的,可使用静态类型解决该问题:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 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等会产生编译错误:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 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新标准引入的随机数简单介绍,欢迎大家一起交流分享。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-01-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档