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

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

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


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


  • 生成器:生成均匀分布的数字的对象。

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

发电机


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


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


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() 返回的最大值。
// 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;
}
复制代码


输出:

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 是字大小)。

// 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;
}
复制代码


输出:

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,该值始终为零。
// 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;
}
复制代码


输出:

8606455 is a random number between 0 and 16777215
复制代码


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


  • random_device:它是真正的随机数生成器。

  • operator() :它返回一个新的随机数。

  • min:它返回成员operator()返回的最小值,对于random_device,该值始终为零。

  • max:它返回成员operator() 返回的最大值。
// 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;
}
复制代码

输出:

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

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

38.png


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


  • min:它返回 operator() 给出的最小值。

  • max:它返回operator() 给出的最大值。

  • operator() :它返回一个新的随机数。

  • 该函数将内部状态更改 1,根据给定的算法修改状态值:
x= (a.x + c)mod m
 Where x= current state value
 a and c = respective class template parameters
 m = class template parameter 
复制代码
// 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;
}
复制代码


输出:

201066682 is a random number between 1 and 2147483646
复制代码


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


  • operator(): 它返回一个新的随机数。该函数将内部状态更改 1,根据以下算法修改状态值:
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)。
// 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;
}
复制代码


输出:

489592737 is a random number between 1 and 2147483646
复制代码


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


  • operator(): 它生成一个随机数。该函数使用转换算法将内部状态更改一个,该算法会在所选元素上产生扭曲。

  • max: 它返回operator()给出的最大值。

  • min: 它返回 operator() 给出的最小值。
// 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;
}
复制代码


输出:

1445431990 is a random number between 0 and 4294967295
复制代码


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


  • operator(): 它返回一个新的随机数。
    该函数通过调用其转换算法来更改内部状态,该算法对元素应用减法随进位操作。

  • max: 它返回operator()给出的最大值。

  • min: 它返回 operator() 给出的最小值。
// 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;
}
复制代码


输出:

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() 给出的最小值。
// 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;
}
复制代码


输出:

8132325 is a random number between 0 and 16777215
复制代码


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


  • operator(): 它返回一个新的随机数。
  • 引擎的转换算法根据需要多次调用基础引擎的 operator() 成员,以获得足够的有效位来构造随机值。

  • max: 它返回operator()给出的最大值。

  • min: 它返回 operator() 给出的最小值。


// 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;
}
复制代码


输出:

13551674127875514537 is a random number between 0 and 184467
复制代码


3. shuffle_order_engine: 它是一个引擎适配器类模板,它适应伪随机数生成器引擎类型,以便以不同的顺序传递数字。


该对象在内部保留一个由 k 个生成的数字组成的缓冲区,并在请求时返回缓冲区内随机选择的数字,并将其替换为从其基本引擎获得的值。


  • operator(): 它返回一个新的随机数。
  • 引擎的转换算法在内部表中选取一个值(由函数返回),并将其替换为从其基础引擎获得的新值。

  • max: 它返回operator()给出的最大值。

  • 最小值: 它返回 operator() 给出的最小值。


// 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;
}
复制代码


输出:


9213395 is a random number between 0 and 16777215



目录
相关文章
关于随机点
关于随机点
59 0
|
Java 数据库 Maven
根据请求中接收到的主动协商头字段,目标资源没有用户代理可以接受的当前表示
今天使用ssm框架搭建了一个项目,测试一个插入的接口结果返回406,但是数据库插入成功了,报错406是因为返回的结果接口无法解析。
865 0
|
7月前
|
网络协议
伪头部校验
伪头部校验
141 6
|
7月前
发送带cookie的请求
发送带cookie的请求
60 1
|
5月前
|
缓存
|
6月前
|
缓存
HTTP响应首部字段释义
【6月更文挑战第23天】响应首部字段是由服务器端向客户端返回响应报文中所使用的字段。
|
7月前
|
存储 缓存
ETag的值是如何在HTTP响应中传递给客户端的
ETag的值是如何在HTTP响应中传递给客户端的
|
7月前
|
安全 Java
解决Cookie值不允许出现中文的问题
通过将中文字符串编码为URL安全格式,并在需要时进行解码,你可以解决Cookie值不允许出现中文的问题。这样可以确保Cookie值的正确性和完整性。 买CN2云服务器,免备案服务器,高防服务器,就选蓝易云。百度搜索:蓝易云
53 0
|
网络协议 安全 Linux
深入解析HTTP请求:了解请求特征与报文格式的关键秘密
这篇文章将带您深入了解HTTP请求的特征和报文格式。HTTP作为一种简单、灵活且易于扩展的协议,适用于各种操作系统和设备。我们还将探讨持久性连接如何提高请求的效率。了解HTTP报文的构成,包括起始行、头部字段和消息正文,将帮助您更好地理解HTTP的工作原理。无论您是初学者还是已经有一定了解的读者,本文都将为您提供全面的HTTP知识。
360 1
深入解析HTTP请求:了解请求特征与报文格式的关键秘密
|
缓存 算法
HTTP协议中的ETag头字段如何实现快速判断资源是否变化?
HTTP协议中的ETag头字段如何实现快速判断资源是否变化?
192 0