C++标准库random

random

完整文档看这里
三步走:

  1. 选择一种随机数种子
  2. 选择一个随机数引擎
  3. 选择一个随机数分布
  4. 输出

随机数种子

//生成随机数种子,在Linux的实现中,是读取/dev/urandom设备
std::random_device rd;
unsigned seed1 = rd();

// 获取当前时间点作为随机数种子
unsigned seed2 = std::chrono::system_clock::now().time_since_epoch().count();

随机数引擎

名称说明
default_random_engine别名,取决于编译器把某个引擎与其关联,
std::linear_congruential_engine
std::minstd_rand0、std::minstd_rand
线性同余引擎
std::mersenne_twister_engine
std::mt19937、std::mt19937_64
Mersenne Twister引擎、梅森旋转算法
std::subtract_with_carry_engine
std::ranlux24_base 、std::ranlux48_base
实现带进位减(一种延迟斐波那契)算法

随机数分布

有很多种 均匀分布、伯努利分布、泊松分布、正态分布、采样分布等等
日常开发中,均匀分布用的比较多,随机抽样、模拟掷骰子、简单的游戏随机数生成时,均匀分布非常常见

均匀分布
std::uniform_int_distribution
正态分布
normal_distribution

总结

建议优先使用

  • random_device 生成随机数种子
  • 随机数引擎 使用 mt19937
  • 随机数分布采用 均与分布
  • 然后这些只是普通用用就好,涉及到加密安全领域,请使用加密安全库(例如: OpenSSL 库)。

上代码

#include <iostream>
#include <random>
using namespace std;

int main()
{
    // 生成随机数种子
    std::random_device rd;
    //梅森旋转算法
    std::mt19937 mt(rd());
    //均匀分布
    std::uniform_int_distribution dis(1, 100);

    for(int i=0;i<10;i++){
        std::cout<<dis(mt)<<endl;
    }
    return 0;
}

如果需要封装成函数可以这样写:

#include <random>

int mt_rand(int min, int max) {
    static std::random_device rd;  // 静态随机数种子
    static std::mt19937 mt(rd());  // 静态梅森旋转引擎,只初始化一次
    std::uniform_int_distribution<int> dis(min, max);  // 均匀分布
    return dis(mt);  // 生成并返回随机数
}
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值