讲师中心 微信公众号
AI工具推荐 视频效率加速

C++如何实现带权重的随机选择算法_C++使用分段累加法代码实现【逻辑】

酷芳小哥_4200

酷芳小哥_4200

发布时间:2026-03-06 11:43:31

|

363人浏览过

|

来源于php中文网

原创

分段累加法是前缀和加二分查找的通俗叫法,用于按权重随机采样:先用std::partial_sum构建严格递增前缀和数组,再用std::uniform_real_distribution生成[0, sum)内随机数,最后以std::upper_bound定位首个大于该值的前缀和索引。

c++如何实现带权重的随机选择算法_c++使用分段累加法代码实现【逻辑】

什么是分段累加法(Alias Method 之外的常用解法)

分段累加法不是标准算法名,而是对「前缀和 + 二分查找」这类实现的通俗叫法。它不依赖复杂预处理,适合权重动态变化不频繁、样本量中等(几百到几千)的场景。核心逻辑是:把每个权重映射成数轴上一段连续区间,总长等于所有权重之和;随机生成一个 [0, sum_weights) 内的浮点或整数,再定位它落在哪一段。

用 std::partial_sum 构建前缀和数组

避免手写循环累加出错,C++ 标准库提供 std::partial_sum 直接生成前缀和。注意输入权重应为非负值,且至少有一个正数,否则行为未定义。

  • 输入权重向量建议用 std::vector<double></double> 或 std::vector<int></int>,保持类型一致
  • 前缀和数组长度与原权重相同,prefix[i] 表示前 i+1 个元素的累计和
  • 若用整数权重,需确保累加不溢出;用 double 可缓解但要注意浮点精度对边界判断的影响
std::vector<double> weights = {2.0, 3.0, 1.0, 4.0};
std::vector<double> prefix(weights.size());
std::partial_sum(weights.begin(), weights.end(), prefix.begin());
// prefix == {2.0, 5.0, 6.0, 10.0}

用 std::upper_bound 定位随机位置

生成 [0, total_sum) 范围内的随机数后,用 std::upper_bound 找第一个严格大于该值的前缀和位置——这个索引就是选中的下标。用 upper_bound 而非 lower_bound 是关键,否则权重为 0 的项可能被跳过或误判。

C++ Code Review Master
C++ Code Review Master

组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。

下载
  • 随机数必须是左闭右开区间:uniform_real_distribution(0.0, total_sum) 或 uniform_int_distribution(0, total_sum - 1)
  • 若权重全为整数且用整型前缀和,推荐用整数随机分布,规避浮点比较误差
  • std::upper_bound 返回迭代器,需减去 begin() 得到索引
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_real_distribution<double> dis(0.0, prefix.back());
double r = dis(gen);
int idx = std::upper_bound(prefix.begin(), prefix.end(), r) - prefix.begin();
// idx ∈ [0, prefix.size())

权重为 0 时的边界行为与性能提醒

如果某个权重是 0,它在前缀和数组中不会“占长度”,但对应元素仍保留在原始容器中。只要前缀和严格递增(即无连续零权重导致相等),upper_bound 就能正确返回首个大于 r 的位置——这意味着权重为 0 的项永远无法被选中,符合预期。

立即学习“C++免费学习笔记(深入)”;

  • 每次选择时间复杂度是 O(log n),构建前缀和是 O(n);若权重频繁变更,应考虑缓存前缀和并在变动时重算
  • 不要在循环内反复调用 std::partial_sum;权重不变时,前缀和只需计算一次
  • 当 n < 20 左右,线性扫描反而比二分更快,可加分支判断

真正容易被忽略的是:随机数分布的右边界必须严格小于总和,否则 upper_bound 可能返回 end(),导致越界访问。务必检查 idx < prefix.size(),尤其在使用浮点时。

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

LibLibAI
LibLibAI Hot

一款AI视频创作工具,主要用于国内领先的AI创意平台,以海量模型、低门槛操作与“创作-分享-商业化”生态,让小白与专业创作者都能高效实现图文乃至视频创意表达,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

相关专题

更多
c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

3408

2025.08.29

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

624

2025.10.23

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

4996

2023.08.14

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

0

2026.09.30

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

0

2026.09.30

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

0

2026.09.30

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

0

2026.09.30

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

0

2026.09.29

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

200

2026.09.23

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Conan 2 Essentials 免费课程
Conan 2 Essentials 免费课程

共0课时 | 0人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习

Conan 2 高级依赖模型介绍
Conan 2 高级依赖模型介绍

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn