Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >C++ 中的随机标头系列1

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

作者头像
鲸落c
发布于 2022-11-28 13:11:14
发布于 2022-11-28 13:11:14
1.4K00
代码可运行
举报
文章被收录于专栏:鲸落学习笔记鲸落学习笔记
运行总次数:0
代码可运行

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

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

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

发电机

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 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
代码运行次数:0
运行
AI代码解释
复制
// 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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
// 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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
// 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
代码运行次数:0
运行
AI代码解释
复制
8606455 is a random number between 0 and 16777215

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

  • random_device:它是真正的随机数生成器。
  • operator() :它返回一个新的随机数。
  • min:它返回成员operator()返回的最小值,对于random_device,该值始终为零。
  • max:它返回成员operator() 返回的最大值。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 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
代码运行次数:0
运行
AI代码解释
复制
default random_device characteristics:
minimum: 0
maximum: 4294967295
entropy: 0
a random number: 3705944883

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

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

  • min:它返回 operator() 给出的最小值。
  • max:它返回operator() 给出的最大值。
  • operator() :它返回一个新的随机数。 该函数将内部状态更改 1,根据给定的算法修改状态值:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 x= (a.x + c)mod m
 Where x= current state value
 a and c = respective class template parameters
 m = class template parameter 
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 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
代码运行次数:0
运行
AI代码解释
复制
201066682 is a random number between 1 and 2147483646

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

  • operator(): 它返回一个新的随机数。该函数将内部状态更改 1,根据以下算法修改状态值:
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
// 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
代码运行次数:0
运行
AI代码解释
复制
489592737 is a random number between 1 and 2147483646

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

  • operator(): 它生成一个随机数。该函数使用转换算法将内部状态更改一个,该算法会在所选元素上产生扭曲。
  • max: 它返回operator()给出的最大值。
  • min: 它返回 operator() 给出的最小值。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 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
代码运行次数:0
运行
AI代码解释
复制
1445431990 is a random number between 0 and 4294967295

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

  • operator(): 它返回一个新的随机数。 该函数通过调用其转换算法来更改内部状态,该算法对元素应用减法随进位操作。
  • max: 它返回operator()给出的最大值。
  • min: 它返回 operator() 给出的最小值。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 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
代码运行次数:0
运行
AI代码解释
复制
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
代码运行次数:0
运行
AI代码解释
复制
// 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
代码运行次数:0
运行
AI代码解释
复制
8132325 is a random number between 0 and 16777215

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

  • operator(): 它返回一个新的随机数。 引擎的转换算法根据需要多次调用基础引擎的 operator() 成员,以获得足够的有效位来构造随机值。
  • max: 它返回operator()给出的最大值。
  • min: 它返回 operator() 给出的最小值。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 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
代码运行次数:0
运行
AI代码解释
复制
13551674127875514537 is a random number between 0 and 184467

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

  • operator(): 它返回一个新的随机数。 引擎的转换算法在内部表中选取一个值(由函数返回),并将其替换为从其基础引擎获得的新值。
  • max: 它返回operator()给出的最大值。
  • 最小值: 它返回 operator() 给出的最小值。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 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
代码运行次数:0
运行
AI代码解释
复制
9213395 is a random number between 0 and 16777215
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-11-22,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
C/C++中随机函数rand()和srand()的用法「建议收藏」
rand()和srand()要一起使用,其中srand()用来初始化随机数种子,rand()用来产生随机数。
全栈程序员站长
2022/08/11
2.2K0
C++随机数(rand和srand)函数用法详解
C++ 提供了一组函数以生成和使用随机数字。随机数字就是从一组可能的值中进行随机选择而获得的一个值。该组中的值都有相同的被选中的几率。
C语言与CPP编程
2020/12/02
4.8K0
C++随机数(rand和srand)函数用法详解
C++11 的随机数的分析
C++11 是一个比较重要的版本,它引入了许多新的语言特性和标准库组件。其中,随机数生成的新特性极大地方便了开发人员在程序中生成随机数。
zayyo
2023/11/30
4260
C++ random_shuffle函数:从兴起到被替代
在C++的发展历程中,random_shuffle函数曾是标准库中用于随机排列序列元素的重要工具。然而,随着C++语言的不断演进,这一函数也经历了从兴起、被弃用到最终被移除的过程。本文将详细回顾random_shuffle函数的使用方法、存在的问题以及其被替代的必然性,帮助你更好地理解这一函数的兴衰历程。
码事漫谈
2025/01/19
1230
C++ random_shuffle函数:从兴起到被替代
都整理给你了,Java各种随机方式对比!
产生的随机数是 0 - 1 之间的一个 double,即 0 <= random <= 1。
攻城狮的那点事
2019/12/10
7230
C++随机数用法大全
程序中经常会需要用到随机数,所谓随机数,就是随机生成一个数字供程序使用。大部分语言都有随机数生成器的函数,比如C/C++就有个最简单随机函数:rand,它可以生成一个“伪随机”的均匀分布的整数,范围在0到系统相关的一个最大值之间。
Cloudox
2021/11/23
6760
C++(STL):22 ---序列式容器queue使用
queue是队列,特点是先进先出,后进后出,你可以理解为数据结构里的队列模型,他只允许你访问 queue<T> 容器适配器的第一个和最后一个元素。只能在容器的末尾添加新元素,只能从头部移除元素。 许多程序都使用了 queue 容器。queue 容器可以用来表示超市的结账队列或服务器上等待执行的数据库事务队列。对于任何需要用 FIFO 准则处理的序列来说,使用 queue 容器适配器都是好的选择。 图 1 展示了一个 queue 容器及其一些基本操作:
用户3479834
2021/02/03
9610
C++(STL):22 ---序列式容器queue使用
浅析SkipList跳跃表原理及代码实现
SkipList在leveldb以及lucence中都广为使用,是比较高效的数据结构。由于它的代码以及原理实现的简单性,更为人们所接受。我们首先看看SkipList的定义,为什么叫跳跃表?
sunsky
2020/08/20
6660
随机数
在 C++ 标准库中,std::rand() 和 std::srand() 是较早的随机数生成方法,适用于简单的需求。需要注意的是,它们的随机数质量不高,且每次运行程序时,如果没有设置种子,生成的随机数序列是固定的。
ljw695
2024/11/21
1350
随机数
Java-随机数详解
在我们的Java课程中通过游戏案例,我们通过随机数来对每次的攻击伤害值进行了一个赋值,那么Java中还有哪些方法可以产生随机数呢?
老九学堂-小师弟
2019/09/20
9850
2018年的新通用伪随机数算法(xoshiro / xoroshiro)的C++(head only)实现
前段时间看到说Lua 5.4用了一种新的通用随机数算法,替换掉本来内部使用的CRT的随机数引擎。我看了一下大致的实现,CPU和空间复杂度任然保持了一个较低的水平,并且循环节和说是随机性都还不错。我们游戏项目中原本对大量随机数场景的随机数算法使用的是基于线性同余的TAUS88,但是使用过程中发现这个算法分布上还是有一些不是很理想,所以就想把这个新的科研成果也用进我们项目中试试看效果。
owent
2018/10/09
2.3K0
C++中时间相关函数用法详解
C++标准库中的 <chrono> 头文件提供了一套用于处理时间的工具,包括时钟、时间点和持续时间等。下面是 <chrono> 库的一些主要组件及其使用示例:
Linux兵工厂
2024/04/01
2840
C++中时间相关函数用法详解
C++ 随机数
    头文件<random>,使用的随机数引擎类是std::default_random_engine,可通过()调用运算符返回随机数,简单的例子:
学徒漠筱歌
2022/07/17
5830
[译]C++17,使用 string_view 来避免复制
当字符串数据的所有权已经确定(譬如由某个string对象持有),并且你只想访问(而不修改)他们时,使用 std::string_view 可以避免字符串数据的复制,从而提高程序效率,这(指程序效率)也是这篇文章的主要内容.
用户2615200
2022/01/12
1.1K0
[译]C++17,使用 string_view 来避免复制
Boost C++ 库 | 多线程
Qt历险记
2024/10/24
2070
Boost C++ 库 | 多线程
rand(),srand()产生随机数
      rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数,是根据一个数,我们可以称它为种子,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统,为了改变这个种子的值,C提供了 srand()函数,它的原形是void srand( int a).       初始化随机产生器既rand()函数的初始值,即使把种子的值改成a; 从这你可以看到通过
猿人谷
2018/01/17
3K0
DS高阶:跳表
skiplist本质上也是一种查找结构,用于解决算法中的查找问题,跟平衡搜索树和哈希表的价值是一样的,可以作为key或者key/value的查找模型。skiplist是由William Pugh发明的,最早出现于他在1990年发表的论文《Skip Lists: A Probabilistic Alternative to Balanced Trees》
小陈在拼命
2024/05/26
850
DS高阶:跳表
JMeter 配置元件之随机变量(RandomVariable)介绍
l 变量名称(Variable Name) - 用于控制在其它元素中引用该值,形式:$(variable_name}
授客
2019/09/11
3.4K0
JMeter 配置元件之随机变量(RandomVariable)介绍
java随机数_Java随机「建议收藏」
Java Random class is used to generate a series of random numbers.
全栈程序员站长
2022/07/18
1.1K0
【Artificial Intelligence篇】AI 时代:内容创作的华丽蜕变与未来展望
在当今数字化快速发展的时代,人工智能(AI)已经成为了各个领域变革的核心驱动力,内容创作领域也不例外。从传统的人工撰写内容到现在借助 AI 工具实现的自动化和智能化创作,我们正处于一场内容创作的革命之中。AI 为内容创作带来了前所未有的机遇和挑战,不仅改变了创作的速度和效率,还重塑了创作的流程和模式。本文将深入探讨 AI 如何推动内容创作的华丽蜕变,并对其未来发展进行展望,同时通过 C++ 代码实例来展示 AI 相关技术在内容创作中的实现方式。
羑悻的小杀马特.
2025/01/23
1430
相关推荐
C/C++中随机函数rand()和srand()的用法「建议收藏」
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档