当前位置: 首页 > news >正文

C++ 洗牌函数std::shuffle的用法

目录

1.简介

2.工作原理

3.std::shuffle 与 std::random_shuffle 的区别

4.rand 和 srand

5.std::shuffle 的使用方法

6.随机数生成器和分布器

7.注意事项


1.简介

        std::shuffle 是 C++ 标准库中用于对序列进行随机重排(洗牌)的一种算法。它可以将容器(例如 std::vectorstd::array、或普通数组等)中的元素随机地打乱顺序,就像洗扑克牌一样。与早期的 std::random_shuffle 相比,std::shuffle 要求使用一个随机数引擎(如 std::default_random_engine),从而在提供更可控、更安全的随机生成方式的同时,也避免了潜在的随机质量问题。这个算法定义在 <algorithm> 头文件中,并且需要 C++11 或更高版本的支持。

        函数原型:

template< class RandomIt, class URNG >
void shuffle( RandomIt first, RandomIt last, URNG&& g );template< class RandomIt >
void shuffle( RandomIt first, RandomIt last );
  • RandomIt:可随机访问的迭代器类型(Random Access Iterator),例如指向 std::vectorstd::array 或内置数组的指针等。

  • URBG:Uniform Random Bit Generator,即随机数引擎类型。比如常用的 std::default_random_enginestd::mt19937(梅森旋转算法引擎)等。

2.工作原理

  std::shuffle 通过多次交换容器中的元素来打乱它们的顺序。每次交换都是基于随机数生成器 g 产生的随机数来决定的。如果未提供随机数生成器,则使用 std::random_device 和 std::default_random_engine 的组合来生成随机数。

3.std::shuffle 与 std::random_shuffle 的区别

        在 C++11 之前,我们常使用 std::random_shuffle 来对容器进行随机洗牌。但从 C++14 开始,std::random_shuffle 被标记为弃用,并在 C++17 中被移除。原因如下:

        随机数来源

  • std::random_shuffle 的默认实现通常基于 rand() 函数来完成随机元素的选择,依赖全局状态;这个函数的随机性质量不够理想,且在不同平台和编译器间不一致。

  • std::shuffle 需要显式传入一个随机数引擎(如 std::default_random_engine),这样在不同机器和编译器上,算法的随机行为更加可控并且符合现代 C++ 中的随机数生成器框架。

        可维护性和安全性

  • std::shuffle 的接口设计更符合现代 C++ 的习惯,使得代码可读性、可维护性更高,同时也避免了因随机数生成方式不一致而产生的可移植性问题。

4.rand 和 srand

这两个是C标准函数,在C++中被放在头文件 <cstdlib> 之中,搜索到的函数声明如下:

__BEGIN_NAMESPACE_STD
/* Return a random integer between 0 and RAND_MAX inclusive.  */
extern int rand (void) __THROW;
/* Seed the random number generator with the given number.  */
extern void srand (unsigned int __seed) __THROW;
__END_NAMESPACE_STD

        其中 std::rand() 是用于返回一个介于[0, RAND_MAX] 范围的伪随机整型值,RAND_MAX 的值最小为 32767,也就是有符号short的最大值,我查到的版本库中的值是2147483647,即有符号int的最大值。

        std::srand() 的作用是为 std::rand() 这个伪随机数生成器设置种子,如果在调用 std::srand() 之前使用了 std::rand(),种子默认为1,相当于调用了 std::srand(1),rand通常不是线程安全的函数,依赖于具体的实现。

        更需要注意的是, std::rand() 生成的是一个伪随机序列,如果随机种子相同,则得到的序列也是相同的,这也是 std::rand 不建议使用的原因,建议是使用C++11随机数生成工具来替换它。

        伪随机序列也并不是“一无是处”,两个进程可以通过设置相同的随机数种子来产生相同的序列,比如可以用于服务器和客户端做帧同步时产生随机数,这样的随机数产生是同步可控的。

        下面举个 std::rand() 使用的例子

#include <iostream>
#include <cstdlib>int main()
{std::srand(1);std::cout << std::rand() << std::endl;std::srand(1);std::cout << std::rand() << std::endl;std::srand(1);std::cout << std::rand() << std::endl;return 0;
}

运行结果如下:

1867856543
1867856543
1867856543

我们可以看到因为随机种子相同,生成的随机数都是同一个,为了使的生成的序列更随机,通常使用当前时间戳 std::time(nullptr) 作为随机种子,然后再生成随机序列:

#include <iostream>
#include <cstdlib>
#include <ctime>int main()
{std::srand(std::time(nullptr));std::cout << std::rand() << std::endl;std::srand(std::time(nullptr));std::cout << std::rand() << std::endl;std::srand(std::time(nullptr));std::cout << std::rand() << std::endl;return 0;
}

运行结果如下:

1864343359
1864343359
1864343359

怎么还是相同的呢?那是因为 std::time(nullptr) 函数返回的时间戳单位是秒,在一秒中内的时间种子是相同的,所以返回的序列也是相同的,通常的使用方法是在程序启动时设置一次时间种子就可以了,并不需要每次都进行设置,而 random_shuffle 中使用了 std::rand() 函数,如果不手动设置时间种子,每次同一时间洗同一副牌,得到的结果也是相同的,所以这也是random_shuffle被后续版本移除的一个原因。

5.std::shuffle 的使用方法

#include <iostream>
#include <vector>
#include <algorithm>
#include <random>   // std::default_random_engine, std::random_deviceint main() {// 准备数据std::vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9 , 10, 11, 12};// 1) 创建一个随机数引擎,通常以随机种子初始化std::random_device rd;  // 硬件随机数生成器(若可用)std::default_random_engine rng(rd()); // 使用 rd 产生种子来初始化引擎// 2) 使用 std::shuffle 对 [v.begin(), v.end()) 范围内的元素进行随机重排std::shuffle(v.begin(), v.end(), rng);// 3) 输出打乱后的结果std::cout << "Shuffled result: ";for (auto i : v) {std::cout << i << " ";}std::cout << std::endl;return 0;
}

在这个示例中,我们使用 std::random_device 获取一个尽量随机的种子,然后用它来初始化一个 std::default_random_engine 引擎。接着将 rng 传递给 std::shuffle 以获得随机化的打乱顺序。

6.随机数生成器和分布器

        random是C++11提供的一个头文件,其中包含多个随机数生成工具,可以使用生成器和分布器的组合产生随机数,其中包含随机数生成器和分布器的多个类实现,分为以下两种:

        Uniform random bit generators (URBGs):均匀随机位生成器,也就是生成均匀分布随机数的对象,可以生成伪随机序列,也可生成真正的随机数序列
        Random number distributions:随机数分布器,用于将URBGs产生的随机数转换为某种特定数学概率分布的序列,如均匀分布、正态分布、泊松分布等

        常见的生成器:

  • linear_congruential_engine: 线性同余生成算法,是最常用也是速度最快的,随机效果一般
  • mersenne_twister_engine: 梅森旋转算法,随机效果最好
  • subtract_with_carry_engine: 滞后Fibonacci算法

常见的适配器,我理解的它的作用是生成器的二次加工厂,对生成器结果进行特定操作

  • discard_block_engine: 丢弃一些数
  • independent_bits_engine: 将序列打包成指定位数的块
  • shuffle_order_engine: 调整序列顺序

预定义的随机数生成器,利用通用生成器和适配器组合出的流行特定生成器:

  • minstd_rand
  • minstd_rand0
  • mt19937: mt是因为这个伪随机数产生器基于Mersenne Twister算法,19937来源于产生随的机数的周期长可达到2^19937-1
  • mt19937_64
  • ranlux24_base
  • ranlux48_base
  • ranlux24
  • ranlux48
  • knuth_b
  • default_random_engine: 编译器可以自行实现

        以上随机数引擎需要一个整型参数作为种子,对于给定的随机数种子,伪随机数生成器总会生成相同的序列,这在测试的时候是相当有用的。而在实际使用时,需要设置随机树作为种子来产出不同的随机数,推荐使用 std::random_device 的值作为随机数种子。

        std::random_device 是一个使用硬件熵源的非确定性随机数发生器,不可预测。

        常见的分布器:

  • uniform_int_distribution: 均匀离散分布
  • uniform_real_distribution: 均匀实数分布
  • bernoulli_distribution: 伯努利分布
  • binomial_distribution: 二项式分布
  • geometric_distribution: 几何分布
  • negative_binomial_distribution: 负二项式分布
  • poisson_distribution: 泊松分布
  • exponential_distribution: 指数分布
  • gamma_distribution: 伽玛分布
  • weibull_distribution: 威布尔分布
  • extreme_value_distribution: 极值分配
  • normal_distribution: 正态分布
  • lognormal_distribution: 对数正态分布
  • chi_squared_distribution: 卡方分布
  • cauchy_distribution: 柯西分布
  • fisher_f_distribution: Fisher F分布
  • student_t_distribution: 学生T分布
  • discrete_distribution: 离散分布
  • piecewise_constant_distribution: 分段常数分布
  • piecewise_linear_distribution: 分段线性分布

下面举个生成器和分布器组合生成随机常用例子,以下为模拟掷骰子生成点数的实现:

#include <iostream>
#include <random>int main()
{std::mt19937 gen(std::random_device{}());std::uniform_int_distribution<> dist(1, 6);for (int i = 0; i < 10; ++i)std::cout << dist(gen) << std::endl;return 0;
}

编译运行结果如下:

3
2
4
1
5
4
1
1
3
4

7.注意事项

  1. 范围std::shuffle 会打乱 [first, last) 的元素。在调用前,请确保迭代器范围合法且在可随机访问的容器内。

  2. 随机引擎种子:如果每次都用相同的种子,那么洗牌的结果也将完全相同。因此,如果需要每次运行程序都得到不同的洗牌结果,建议使用 std::random_device 或时间戳等方式进行初始化。

  3. 算法复杂度std::shuffle 实现了线性复杂度(O(n))的洗牌算法(Fisher–Yates shuffle 或 Knuth shuffle),不会随着容器大小指数级增长。对于大规模数据,这点十分重要。

  4. 可移植性:当使用相同的随机引擎和相同的种子时,std::shuffle 洗牌结果在不同平台上应该是一致的(因为随机数引擎按标准定义了算法),但如果使用不同的编译器或与平台相关的自定义实现,则仍有可能出现微小差异。

相关文章:

C++ 洗牌函数std::shuffle的用法

目录 1.简介 2.工作原理 3.std::shuffle 与 std::random_shuffle 的区别 4.rand 和 srand 5.std::shuffle 的使用方法 6.随机数生成器和分布器 7.注意事项 1.简介 std::shuffle 是 C 标准库中用于对序列进行随机重排&#xff08;洗牌&#xff09;的一种算法。它可以将容…...

MySQL InnoDB引擎 MVCC

MVCC&#xff08;Multi-Version Concurrency Control&#xff09;即多版本并发控制&#xff0c;是 MySQL 的 InnoDB 存储引擎实现并发控制的一种重要技术。它在很多情况下避免了加锁操作&#xff0c;从而提高了数据库的并发性能。 一、原理 MVCC 的核心思想是通过保存数据在某…...

【Elasticsearch】simple_query_string

Elasticsearch 的simple_query_string查询是一种灵活且容错性较强的查询方式&#xff0c;它允许用户通过简单的语法构造查询字符串&#xff0c;以实现对文档的搜索。以下是关于simple_query_string查询的详细说明&#xff1a; 1.基本概念 simple_query_string查询是一种基于字…...

数据结构 04

4. 栈 4.2. 链式栈 4.2.1. 特性 逻辑结构&#xff1a;线性结构 存储结构&#xff1a;链式存储结构 操作&#xff1a;创建&#xff0c;入栈&#xff0c;出栈&#xff0c;清空&#xff0c;获取 4.2.2. 代码实现 头文件 LinkStack.h #ifndef __LINKSTACK_H__ #define __LINKST…...

Java并发中的上下文切换、死锁、资源限制

在Java并发编程中&#xff0c;上下文切换、死锁和资源限制是开发者经常需要面对的问题。这些问题不仅会影响程序的性能&#xff0c;还可能导致程序无法正常运行。本文将深入探讨这些问题的原理、影响以及如何在实际开发中避免或解决它们。 目录 1. 上下文切换&#xff08;Con…...

DeepSeek教unity------MessagePack-01

MessagePack是C# 的极速 MessagePack 序列化器。它比 MsgPack-Cli 快 10 倍&#xff0c;并且性能超过其他 C# 序列化器。MessagePack for C# 还内置支持 LZ4 压缩——一种极其快速的压缩算法。性能在诸如游戏、分布式计算、微服务或数据缓存等应用中尤为重要。 这个库通过 NuGe…...

【大语言模型】最新ChatGPT、DeepSeek等大语言模型助力高效办公、论文与项目撰写、数据分析、机器学习与深度学习建模等科研应用

ChatGPT、DeepSeek等大语言模型助力科研应用 随着人工智能技术的快速发展&#xff0c;大语言模型如ChatGPT和DeepSeek在科研领域的应用正在为科研人员提供强大的支持。这些模型通过深度学习和大规模语料库训练&#xff0c;能够帮助科研人员高效地筛选文献、生成论文内容、进行数…...

泰勒公式推导以及常用展开式与近似计算

泰勒公式的基本思想是通过函数在某点的导数来逐渐构建一个多项式&#xff0c;该多项式能够近似函数在该点附近的值。我们通过一次次引入导数来改进近似&#xff0c;从而得到一个无限级数的展开。 准备工作&#xff1a;函数的定义和导数 假设我们有一个函数 f ( x ) f(x) f(x)…...

深入解析A2DP v1.4协议:蓝牙高质量音频传输的技术与实现

1. A2DP概述 A2DP&#xff08;Advanced Audio Distribution Profile&#xff09;是一种高质量音频流媒体协议&#xff0c;旨在实现高质量音频内容的分发&#xff0c;通常用于通过蓝牙设备传输音频数据&#xff0c;例如将音乐从便携式播放器传输到耳机或扬声器。与传统的蓝牙语…...

STM32引脚VBAT和RTC的关系

一、RTC简介 1、RTC (Real Time Clock)&#xff1a;实时时钟。RTC是个独立的定时器。RTC模块拥有一个连续计数的计数器&#xff0c;在相应的软件配置下&#xff0c;可以提供时钟日历的功能。修改计数器的值可以重新设置当前时间和日期。RTC还包含用于管理低功耗模式的自动唤醒单…...

untiy 3d 混合动画

1.创建动画控制器 挂在到人物模型上 效果 20250213_170924...

django配置跨域

1、第一种 from django.views.decorators.csrf import csrf_exemptcsrf_exempt第二种 安装 pip install django-cors-headers在配置文件settings.py进入 INSTALLED_APPS [..."corsheaders", # 添加 ]MIDDLEWARE [corsheaders.middleware.CorsMiddleware, # 添加…...

【设计模式】【行为型模式】迭代器模式(Iterator)

&#x1f44b;hi&#xff0c;我不是一名外包公司的员工&#xff0c;也不会偷吃茶水间的零食&#xff0c;我的梦想是能写高端CRUD &#x1f525; 2025本人正在沉淀中… 博客更新速度 &#x1f44d; 欢迎点赞、收藏、关注&#xff0c;跟上我的更新节奏 &#x1f3b5; 当你的天空突…...

前端面试题目---页面抖动的原因、如何避免、如何解决

前端页面抖动是一个常见且影响用户体验的问题&#xff0c;下面将从抖动发生的场景、解决办法以及预防措施三个方面进行详细阐述。 页面抖动发生的场景 1. 元素尺寸动态变化 图片加载&#xff1a;当页面中图片的宽高没有预先设定&#xff0c;在图片加载完成后&#xff0c;其实…...

DeepSeek 突然来袭,AI 大模型变革的危机与转机藏在哪?

随着人工智能技术的飞速发展&#xff0c;大模型领域不断涌现出具有创新性的成果。DeepSeek 的横空出世&#xff0c;为 AI 大模型领域带来了新的变革浪潮。本文将深入探讨 DeepSeek 出现后 AI 大模型面临的危机与转机。 冲冲冲&#xff01;&#xff01;&#xff01; 目录 一、…...

将Sqlite3数据库挂在内存上处理

创作灵感&#xff1a;最近把小学生的口算题从2位数改到3位数&#xff0c;100以内四则运算练习&#xff08;千纬数学&#xff09;再次更新&#xff0c;选取难题-CSDN博客要不断刷题目&#xff0c;以前100以内的加减乘除也是这样刷出来的&#xff0c;代码如下&#xff1a; impor…...

#用于跟踪和反映数据源对象的变化--useMagical

import { cloneDeep } from lodash-es import { reactive, ref, watchEffect } from vue /*** 神奇函数* param source 数据源,* param initKey 固定需要返回的属性* description 收集数据源中修改的属性,并返回* version 1.0 仅支持对象* author sufei* return { source, resu…...

基于微信小程序的场地预约设计与实现

第3章 系统设计 3.1系统设计目标 本系统的实现可以帮助体育馆场地信息的管理。帮助管理员对注册用户管理以及用户预约管理。同时可以帮助用户进行场地预约。本系统可以实现用户足不出户预约到需要的场地&#xff0c;为用户提供场地信息了解的平台。 3.2系统功能结构图 本系统的…...

1446. 连续字符 简单

1446. 连续字符https://leetcode.cn/problems/consecutive-characters/ 给你一个字符串 s &#xff0c;字符串的「能量」定义为&#xff1a;只包含一种字符的最长非空子字符串的长度。 请你返回字符串 s 的 能量。 示例 1&#xff1a; 输入&#xff1a;s "leetcode"…...

多张图片合成PDF

昨天接了一个家教&#xff0c;在网上搜集了一些图片格式的素材&#xff0c;但想要发给学生家长打印&#xff0c;都是图片格式可能不太方便&#xff0c;就想着合成pdf文件之后再发给家长。 试用了“samll*”一次&#xff0c;就需要充值vip了&#xff0c;所以就用python自己写了…...

【办公】钉钉修改默认存储位置,释放C盘空间

Step1: 右击钉钉图标选择设置 Step2: 通用里面找到文件保存位置&#xff0c;修改文件目录: 最新版本钉钉界面&#xff1a; 设置完成后按提示重启即可&#xff01;...

VLLM历次会议(2024.7)

支持LLama3.1&#xff1a; 量化&#xff1a; vllm git下的子项目&#xff1a;llm-compressor CPU offloading 允许跑更大的模型&#xff1b;会变慢些&#xff1b;在CPU-GPU之间有NVLink的机器上&#xff0c;变慢的幅度小。 新增对Medusa&#xff08;用1个Head并行推出好几个…...

进程等待与进程替换

目录 一、进程等待 1.1 为什么要等待子进程&#xff1f; 1.2 等待的两种方式 1.2.1 wait函数 1.2.2 waitpid函数 1.3 获取子进程的退出状态 1.4 示例代码 阻塞式等待&#xff08;同步&#xff09; 非阻塞等待&#xff08;异步&#xff09; 二、进程替换 2.1 什么是进…...

C# CultureInfo 地区影响字符串

问题 线上遇到有玩家资源加载异常&#xff0c;发现资源路径出现异常字符&#xff1a; 发现是土耳其语下字符串转小写不符合预期&#xff1a; "I".ToLower() -> ı 解决方案 String.ToLower 改成 String.ToLowerInvariant 全局修改禁用文化差异&#xff1a;ht…...

走进 Tcl 语言:历史、特性与应用

亲爱的小伙伴们&#x1f618;&#xff0c;在求知的漫漫旅途中&#xff0c;若你对深度学习的奥秘、Java 与 Python 的奇妙世界&#xff0c;亦或是读研论文的撰写攻略有所探寻&#x1f9d0;&#xff0c;那不妨给我一个小小的关注吧&#x1f970;。我会精心筹备&#xff0c;在未来…...

CNN-LSSVM卷积神经网络最小二乘支持向量机多变量多步预测,光伏功率预测

代码地址&#xff1a;CNN-LSSVM卷积神经网络最小二乘支持向量机多变量多步预测&#xff0c;光伏功率预测 CNN-LSSVM卷积神经网络最小二乘支持向量机多变量多步预测&#xff0c;光伏功率预测 一、引言 1、研究背景和意义 光伏发电作为可再生能源的重要组成部分&#xff0c;近…...

使用MaxKB及deepseek搭建本地AI知识库

序 本文主要研究一下如何MaxKB及deepseek搭建本地AI知识库 步骤 拉取MaxKB镜像 docker pull cr2.fit2cloud.com/1panel/maxkb如果拉取不下来就用docker.1ms.run/1panel/maxkb 启动MaxKB docker run -d --namemaxkb --restartalways -p 8080:8080 \ -v ~/.maxkb:/var/lib/p…...

一文通俗理解为什么需要泛型以及泛型的使用

为什么需要泛型&#xff1f; public static void main(String[] args) {ArrayList list new ArrayList();// 由于集合没有做任何限定&#xff0c;任何类型都可以给其中存放list.add("abc");list.add("def");list.add(5);Iterator it list.iterator();wh…...

凸包算法—— cad c#二次开发

效果如下&#xff1a; 代码如下&#xff1a; using IfoxDemo; //[assembly: CommandClass(typeof(IFoxDemo.凸包class))]//只允许此类快捷键命令 namespace IFoxDemo {public class 凸包class{public static class 凸包助手{/// <summary>/// 计算点集的凸包并返回多段线…...

Eclipse JSP/Servlet 深入解析

Eclipse JSP/Servlet 深入解析 引言 随着互联网的快速发展,Java Web开发技术逐渐成为企业级应用开发的主流。在Java Web开发中,JSP(JavaServer Pages)和Servlet是两个核心组件,它们共同构成了Java Web应用程序的基础。本文将深入解析Eclipse平台下的JSP/Servlet技术,帮…...

grep如何排除多个目录?

在使用 grep 进行文本搜索时&#xff0c;有时候需要排除多个目录&#xff0c;避免在这些目录下进行搜索。下面介绍几种不同的实现方式。 目录 1.使用 -r 和 --exclude-dir 选项&#xff08;GNU grep&#xff09; 2.使用扩展正则表达式和 -P 选项&#xff08;GNU grep&#x…...

linux ollama deepseek等大语言模型的model文件的存储目录

linux ollama deepseek等大语言模型的model文件的存储目录 一、用ollama serve启动的&#xff0c;模型数据存放在&#xff1a; /usr/share/ollama/.ollama/models二、如果在自启动文件中指定了工作目录&#xff0c;则在工作目录下的.ollama/models 1.自启动服务 /etc/system…...

React进阶之React核心源码解析(二)

React核心源码解析 diff单一节点比较diff多节点比较diff两轮遍历比较第一轮比较第二轮比较 Update 状态更新Concurrent Mode diff 一共两个阶段 render&#xff1a;内存中的更新&#xff0c;主要是通过递归的过程&#xff0c;来将react变化的部分&#xff0c;在内存中找到哪些…...

八、OSG学习笔记-

前一章节&#xff1a; 七、OSG学习笔记-碰撞检测-CSDN博客https://blog.csdn.net/weixin_36323170/article/details/145558132?spm1001.2014.3001.5501 一、了解OSG图元加载显示流程 本章节代码&#xff1a; OsgStudy/wids CuiQingCheng/OsgStudy - 码云 - 开源中国https:…...

Python实现随机森林(Random Forest)算法

随机森林&#xff08;Random Forest&#xff09;是一种集成学习方法&#xff0c;通过构建多个决策树并结合它们的预测结果来提高模型的准确性和稳定性。下面是一个使用Python实现随机森林算法的示例。我们将使用scikit-learn库&#xff0c;它提供了方便的接口来实现随机森林。 …...

平方数列与立方数列求和的数学推导

先上结论&#xff1a; 平方数列求和公式为&#xff1a; S 2 ( n ) n ( n 1 ) ( 2 n 1 ) 6 S_2(n) \frac{n(n1)(2n1)}{6} S2​(n)6n(n1)(2n1)​ 立方数列求和公式为&#xff1a; S 3 ( n ) ( n ( n 1 ) 2 ) 2 S_3(n) \left( \frac{n(n1)}{2} \right)^2 S3​(n)(2n(n1)​…...

new和malloc的区别

new malloc流程 new new流程 调用operator new 分配内存&#xff1a;在free store 生成对象 free store 可能在 堆 / 自定义的地方 可以认为虚拟内存到物理内存的映射关系早已完成 若分配内存失败&#xff08;内存空间不够&#xff09;&#xff0c;抛出std::bad_alloc 异常…...

JVM——垃圾回收算法

目录 垃圾回收算法 评价标准&#xff1a; 标记-清除算法&#xff1a; 复制算法&#xff1a; 标记-整理算法&#xff1a; 分代GC&#xff1a; arthas查看分代之后的内存情况&#xff1a; 垃圾回收算法 java是如何实现垃圾回收的呢&#xff1f;简单来说&#xff0c;垃圾回…...

算法日记16:SC68 联通块问题(并查集)

一、题目&#xff1a; 二、题解&#xff1a; 1、看到求联通块问题&#xff0c;我们可以考虑使用DFS/并查集(在这里我们仅介绍并查集) 2、什么是并查集&#xff1f; 2.1&#xff1a;初始化&#xff1a;对于每一个点&#xff0c;我们都对其进行初始化操作pre[i]i pre[i]表示i的…...

Unity-Mirror网络框架-从入门到精通之Pong示例

文章目录 前言示例介绍NetworkManagerPongBallPlayer总结前言 在现代游戏开发中,网络功能日益成为提升游戏体验的关键组成部分。本系列文章将为读者提供对Mirror网络框架的深入了解,涵盖从基础到高级的多个主题。Mirror是一个用于Unity的开源网络框架,专为多人游戏开发设计…...

c++ 多线程知识汇总

一、std::thread std::thread 是 C11 引入的标准库中的线程类&#xff0c;用于创建和管理线程 1. 带参数的构造函数 template <class F, class... Args> std::thread::thread(F&& f, Args&&... args);F&& f&#xff1a;线程要执行的函数&…...

探索 Text-to-SQL 技术:从自然语言到数据库查询的桥梁

亲爱的小伙伴们&#x1f618;&#xff0c;在求知的漫漫旅途中&#xff0c;若你对深度学习的奥秘、Java 与 Python 的奇妙世界&#xff0c;亦或是读研论文的撰写攻略有所探寻&#x1f9d0;&#xff0c;那不妨给我一个小小的关注吧&#x1f970;。我会精心筹备&#xff0c;在未来…...

Java NIO ByteBuffer 详解

什么是 ByteBuffer ByteBuffer 是 Buffer 的一个具体实现&#xff0c;专门用于存储和操作字节数据。它提供了高效的、基于内存的 I/O 数据处理方式。 Buffer 类是构建 Java NIO 的基础&#xff0c;其中 ByteBuffer 类是 Buffer 子类中最受欢迎的。这是因为字节类型是最通用的…...

【机器学习】简单线性回归算法及代码实现

线性回归算法 一、摘要二、线性回归算法概述三、损失函数的定义和衡量标准四、简单线性回归的求解和应用五、机器学习算法一般求解思路 一、摘要 本文讲解了线性回归算法的基础知识和应用&#xff0c;强调线性回归主要用于解决回归问题。通过分析房产价格与房屋面积的关系&…...

【前端开发】query参数和params参数的区别

在Web开发中&#xff0c;query参数&#xff08;URL查询参数&#xff09;和params参数&#xff08;路由参数&#xff09;是两种不同的URL传参方式&#xff0c;它们的核心区别如下&#xff1a; 一、 位置不同 query参数params参数位置URL中?之后&#xff0c;用&连接多个参数…...

人工智能数学基础学习PPT

学习视频&#xff1a;人工智能 -数学基础 文章目录 1.简介1.函数2.极限3.无穷小与无穷大4.连续性与导数5.偏导数6.方向导数7.梯度 2.微积分1.微积分基本想法2.微积分的解释3.定积分4.定积分性质5.牛顿-莱布尼茨公式 3.泰勒公式与拉格朗日1.泰勒公式2.一点一世界3.阶数的作用4.…...

企业文件防泄密软件哪个好?

在企业文件防泄密软件领域&#xff0c;天锐绿盾和中科数安都是备受认可的品牌&#xff0c;它们各自具有独特的特点和优势。 以下是对这两款软件的详细比较&#xff1a; 天锐绿盾 功能特点 集成性强&#xff1a;集成了文件加密、数据泄露防护DLP、终端安全管理、行为审计等数据安…...

美丽 百褶裙提示词 + MD

MD 参考教程&#xff1a;Marvelous Designer零基础教学&#xff0c;MD布料制作-百褶裙建模制作&#xff0c;次世代教学_哔哩哔哩_bilibili 【MD新手教程】30分钟教会你制作百褶裙&#xff0c;Marvelous Designer超简单入门案例教程_哔哩哔哩_bilibili 【c4d技术解析】MD百褶裙…...

解释和对比“application/octet-stream“与“application/x-protobuf“

介绍 在现代 Web 和分布式系统的开发中&#xff0c;数据的传输和交换格式扮演着关键角色。为了确保数据在不同系统之间的传输过程中保持一致性&#xff0c;MIME 类型&#xff08;Multipurpose Internet Mail Extensions&#xff09;被广泛应用于描述数据的格式和内容类型。在 …...

基于YALMIP和cplex工具箱的微电网最优调度算法matlab仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 系统建模 4.2 YALMIP工具箱 4.3 CPLEX工具箱 5.完整工程文件 1.课题概述 基于YALMIP和cplex工具箱的微电网最优调度算法matlab仿真。通过YALMIP和cplex这两个工具箱&#xff0c;完成微电网的最优调…...