栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++ <random> 速通

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++ <random> 速通

random

C++11之前只有srand/rand()可以来获取均匀分布的随机数

在(Since C++11)中 随机数的获取分为了一组协作的类

  • 随机数引擎(Engines) --> 生成随机的unsigned序列
  • 随机数分布(Distribution) --> 使用Engine返回服从特定分布的随机数

随机数(伪随机数)产生的原理为 对于给定的初始值(seed) 经过计算 得到非周期性的结果

C-like

标准库提供一个默认的随机数引擎std::default_random_engine 它的具体类型取决与编译器

可以这样实现一个random函数 std::default_random_engine的一个有参构造函数指定了初始化时的随机数种子

#include
unsigned _your_random(){
  static std::default_random_engine dre;
  return dre();
}
引擎

引擎(Engine)类有一些通用操作

  • Engine::result_type 引擎使用和生成数值的类型
  • Engine e;
  • Engine e(seed);
  • e.seed(_seed);
  • e.min/max(); 上下确界
  • e.discard(ull); 丢弃多个随机数
// discard 的实现
void discard(unsigned long long __z){
  for (; __z != 0ULL; --__z)(*this)();
}

更多引擎类

引擎模板 C++11实现了三种引擎模板

  • linear_congruential_engine : 实现线性同余算法
  • mersenne_twister_engine : 实现梅森缠绕器算法
  • subtract_with_carry_engine : 实现带进位减(一种延迟斐波那契)算法

几种预定义的随机数生成器(充满了Magic Number)

using minstd_rand0 = std::linear_congruential_engine; // 1988年的最小标准
using minstd_rand = std::linear_congruential_engine; // 1993年的最小标准

using mt19937 = std::mersenne_twister_engine; // 32bit 梅森缠绕器

using mt19937_64 = std::mersenne_twister_engine; // 64bit 梅森缠绕器

using ranlux24_base = std::subtract_with_carry_engine;
using ranlux48_base = std::subtract_with_carry_engine;
分布

分布(Dist)类有一些通用操作

  • Dist d; 其他构造函数根据具体的分布类而定
  • d(e); 获取服从该分布的随机数
  • d.min/max(); 上下确界
  • d.reset(); 重置分布状态 消除之前产生数据的影响

均匀分布代码示例

#include
#include
int main(){
  std::default_random_engine dre;
  std::uniform_int_distribution uniform(0,19); // 创建闭区间 [0, 19] 上的分布
  std::uniform_real_distribution ur(0,1); // 区间 [a, b) 上的均匀分布
  for(int i=0;i<10;++i){
    std::cout< 

伯努利分布示例

#include
#include
template
void repeat(unsigned times,func fn){
  for(;times!=0;--times)fn();
}
int main(){
  std::default_random_engine dre;
  std::bernoulli_distribution bd;
  int count = 0;
  repeat(1e5,[&](){count+=bd(dre);});
  std::cout<#include 
#include 
#include 
 
int main(){
  std::seed_seq seq{1,2,3,4,5};
  std::vector seeds(10);
  seq.generate(seeds.begin(), seeds.end());
  for (std::uint32_t n : seeds) {
      std::cout << n << 'n';
  }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/951562.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号