前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++ 中的随机标头系列1

C++ 中的随机标头系列1

作者头像
鲸落c
发布2022-11-28 21:11:14
1.3K0
发布2022-11-28 21:11:14
举报
文章被收录于专栏:鲸落学习笔记鲸落学习笔记

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情

此标头引入了随机数生成功能。该库允许使用生成器和分布的组合生成随机数。

  • 生成器:生成均匀分布的数字的对象。
  • 分布:将生成器生成的数字序列转换为遵循特定随机变量分布(如均匀、正态或二项式)的数字序列的对象。

发电机

一、伪随机数引擎: 他们使用一种算法根据初始种子生成随机数。

1. linear_congruential_engine:它是 STL 库中生成随机无符号整数的最简单引擎。它如下:

代码语言:javascript
复制
 x = (a.x +c) mod m 
Where x= current state value  
            a = multiplier parameter ; if m is not zero, 
            this parameter should be lower than m.
            c = increment parameter ; if m is not zero, 
            this parameter should be lower than m.
            m = modulus parameter 
  • operator(): 它生成随机数。
  • min: 它给出成员 operator() 返回的最小值。
  • max: 它给出成员 operator() 返回的最大值。
代码语言:javascript
复制
// C++程序,用于说明在linear_congruential_engine中使用operator()、max和min
#include <iostream>
#include <chrono>
#include <random>
using namespace std;

// 驱动程序
int main (){
    unsigned seed = chrono::system_clock::now().time_since_epoch().count();
    minstd_rand0 generator (seed);
    cout << generator() << " is a random number between ";
    cout << generator.min() << " and " << generator.max();	
    return 0;
}

输出:

代码语言:javascript
复制
211182246 is a random number between 1 and 2147483646

2. mersenne_twister_engine: 是基于梅森费尔托斯特算法的随机数引擎。它在区间 [0, (2^w)-1] 内生成高质量的无符号整数随机数。 其中“w”是字大小:状态序列中每个字的位数。

  • operator(): 它生成随机数。
  • min: 它返回成员operator()返回的最小值,对于mersenne_twister_engine,该值始终为零。
  • max: 它返回成员operator()返回的最大值,对于mersenne_twister_engine为 2w-1(其中 w 是字大小)。
代码语言:javascript
复制
// C++程序,用于说明在mersenne_twister_engine中使用operator()、min和max
#include <iostream>
#include <chrono>
#include <random>
using namespace std;

// 驱动程序
int main (){
    unsigned seed = chrono::system_clock::now().time_since_epoch().count();
    mt19937 generator (seed);
    cout << generator() << " is a random number between ";
    cout << generator.min() << " and " << generator.max();	
    return 0;
}

输出:

代码语言:javascript
复制
3348201622 is a random number between 0 and 4294967295

3. subtract_with_carry_engine: 是一种产生无符号整数的伪随机数生成器引擎。 使用的算法是一个滞后斐波那契生成器,具有 r 个整数元素的状态序列,加上一个进位值。

  • operator() :它生成随机数。
  • max:它返回成员operator()返回的最大值,对于 subtract_with_carry_engine 为 (2^w)-1,其中 'w' 是单词大小。
  • min:它返回成员operator()返回的最小值,对于 subtract_with_carry_engine,该值始终为零。
代码语言:javascript
复制
// C++程序,用于说明减法器with_carry_engine中operator()、min和max的用法
#include <iostream>
#include <chrono>
#include <random>
using namespace std;

// 驱动程序
int main (){
    unsigned seed = chrono::system_clock::now().time_since_epoch().count();	
    subtract_with_carry_engine<unsigned, 24, 10, 24> generator (seed);
    cout << generator() << " is a random number between ";
    cout << generator.min() << " and " << generator.max();
    return 0;
}

输出:

代码语言:javascript
复制
8606455 is a random number between 0 and 16777215

II.随机数生成器:它是一种产生非确定性随机数的随机数生成器

  • random_device:它是真正的随机数生成器。
  • operator() :它返回一个新的随机数。
  • min:它返回成员operator()返回的最小值,对于random_device,该值始终为零。
  • max:它返回成员operator() 返回的最大值。
代码语言:javascript
复制
// C++程序,用于说明在random_device中使用operator()、min和max
#include <iostream>
#include <random>
using namespace std;

//驱动程序
int main ()
{
    random_device example;	
    cout << "default random_device characteristics:" << endl;
    cout << "minimum: " << example.min() << endl;
    cout << "maximum: " << example.max() << endl;
    cout << "entropy: " << example.entropy() << endl;
    cout << "a random number: " << example() << endl;	
    return 0;
}

输出:

代码语言:javascript
复制
default random_device characteristics:
minimum: 0
maximum: 4294967295
entropy: 0
a random number: 3705944883

III. 伪随机数引擎( 实例化):这些是生成器引擎和适配器的特定实例化:

image.png
image.png

1. default_random_engine:这是一个生成伪随机数的随机数引擎类。

  • min:它返回 operator() 给出的最小值。
  • max:它返回operator() 给出的最大值。
  • operator() :它返回一个新的随机数。 该函数将内部状态更改 1,根据给定的算法修改状态值:
代码语言:javascript
复制
 x= (a.x + c)mod m
 Where x= current state value
 a and c = respective class template parameters
 m = class template parameter 
代码语言:javascript
复制
// C++程序,用于说明在default_random_engine中使用operator()、min和max
#include <iostream>
#include <chrono>
#include <random>
using namespace std;

// 驱动程序
int main ()
{
    unsigned seed = chrono::system_clock::now().time_since_epoch().count();
    minstd_rand0 generator (seed);
    cout << generator() << " is a random number between ";
    cout << generator.min() << " and " << generator.max();	
    return 0;
}

输出:

代码语言:javascript
复制
201066682 is a random number between 1 and 2147483646

2. minstd_rand: 生成伪随机数;它类似于线性全余生成器

  • operator(): 它返回一个新的随机数。该函数将内部状态更改 1,根据以下算法修改状态值:
代码语言:javascript
复制
x = (a.x + c) mod m
where x= current state value
a ,c and m=class template parameter
  • min: 它返回成员operator()给出的最小值。
  • max: 它返回成员operator()给出的最大值,对于linear_congruential_engine为 (modulus-1)。
代码语言:javascript
复制
// C++程序,用于说明在minstd_land中使用operator()、max和min
#include <iostream>
#include <chrono>
#include <random>
using namespace std;

//驱动代码
int main ()
{
    
unsigned seed = chrono::system_clock::now().time_since_epoch().count();
minstd_rand0 generator (seed);
cout << generator() << " is a random number between ";
cout << generator.min() << " and " << generator.max();
return 0;
}

输出:

代码语言:javascript
复制
489592737 is a random number between 1 and 2147483646

3. mt19937: 它是梅森费尔托斯特19937发电机。它是一个状态大小为 19937 位的 32 位数字的伪随机生成器。

  • operator(): 它生成一个随机数。该函数使用转换算法将内部状态更改一个,该算法会在所选元素上产生扭曲。
  • max: 它返回operator()给出的最大值。
  • min: 它返回 operator() 给出的最小值。
代码语言:javascript
复制
// C++程序演示mt19937中operator()、min和max的使用
#include <iostream>
#include <chrono>
#include <random>
using namespace std;

// 驱动程序
int main ()
{
unsigned seed = chrono::system_clock::now().time_since_epoch().count();
mt19937 generator (seed);
cout << generator() << " is a random number between ";
cout << generator.min() << " and " << generator.max();
return 0;
}

输出:

代码语言:javascript
复制
1445431990 is a random number between 0 and 4294967295

4.ranlux24_base: 它是Ranlux 24基础发电机。它是一个 24 位数字的减法伪随机生成器,通常用作 ranlux24 生成器的基础引擎。

  • operator(): 它返回一个新的随机数。 该函数通过调用其转换算法来更改内部状态,该算法对元素应用减法随进位操作。
  • max: 它返回operator()给出的最大值。
  • min: 它返回 operator() 给出的最小值。
代码语言:javascript
复制
// C++程序演示了在ranlux24_base中使用operator()、min和max
#include <iostream>
#include <chrono>
#include <random>
using namespace std;

//驱动程序
int main ()
{	
unsigned seed = chrono::system_clock::now().time_since_epoch().count();
subtract_with_carry_engine<unsigned,24,10,24> generator (seed);
cout << generator() << " is a random number between ";
cout << generator.min() << " and " << generator.max();
return 0;
}

输出:

代码语言:javascript
复制
7275352 is a random number between 0 and 16777215

类似的格式适用于其他示例。

四、发动机适配器

1. discard_block_engine: 它是一个引擎适配器类模板,它通过仅使用其生成的序列中每个“p”元素块的“r”元素来适应伪随机数生成器引擎类型,丢弃其余元素。

标准发电机ranlux24ranlux48使用此适配器适应subtract_with_carry_engine

  • operator(): 它返回一个新的随机数。
  • max: 它返回operator()给出的最大值。
  • min: 它返回 operator() 给出的最小值。
代码语言:javascript
复制
// C++程序演示了在discard_block_engine中使用operator()、min和max
#include <iostream>
#include <chrono>
#include <random>
using namespace std;

//驱动程序
int main ()
{
unsigned seed = chrono::system_clock::now().time_since_epoch().count();
ranlux24 generator (seed);
cout << generator() << " is a random number between ";
cout << generator.min() << " and " << generator.max();
return 0;
}

输出:

代码语言:javascript
复制
8132325 is a random number between 0 and 16777215

2. independent_bits_engine: 它是一个引擎适配器类模板,它适应伪随机数生成器引擎类型以产生具有特定位数(w)的随机数

  • operator(): 它返回一个新的随机数。 引擎的转换算法根据需要多次调用基础引擎的 operator() 成员,以获得足够的有效位来构造随机值。
  • max: 它返回operator()给出的最大值。
  • min: 它返回 operator() 给出的最小值。
代码语言:javascript
复制
// C++程序,用于说明在independent_bits_engine中使用operator()、min和max
#include <iostream>
#include <chrono>

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

//驱动程序
int main ()
{	
unsigned seed = chrono::system_clock::now().time_since_epoch().count();
independent_bits_engine<mt19937,64,uint_fast64_t> generator (seed);
cout << generator() << " is a random number between ";
cout << generator.min() << " and " << generator.max();
return 0;
}

输出:

代码语言:javascript
复制
13551674127875514537 is a random number between 0 and 184467

3. shuffle_order_engine: 它是一个引擎适配器类模板,它适应伪随机数生成器引擎类型,以便以不同的顺序传递数字。 该对象在内部保留一个由 k 个生成的数字组成的缓冲区,并在请求时返回缓冲区内随机选择的数字,并将其替换为从其基本引擎获得的值。

  • operator(): 它返回一个新的随机数。 引擎的转换算法在内部表中选取一个值(由函数返回),并将其替换为从其基础引擎获得的新值。
  • max: 它返回operator()给出的最大值。
  • 最小值: 它返回 operator() 给出的最小值。
代码语言:javascript
复制
// C++程序演示了在shuffle_order_engine中使用 operator()、min和max
#include <iostream>
#include <chrono>
#include <random>
using namespace std;

int main ()
{
    
// 查找系统时钟(当前时间)和时钟纪元之间的时间
unsigned seed = chrono::system_clock::now().time_since_epoch().count();
ranlux24 generator (seed);
cout << generator() << " is a random number between ";
cout << generator.min() << " and " << generator.max();
return 0;
}

输出:

代码语言:javascript
复制
9213395 is a random number between 0 and 16777215
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2022-11-22,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

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