news 2026/3/13 3:40:51

抽奖机随机号码序列生成算法实现与比较

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
抽奖机随机号码序列生成算法实现与比较

抽奖机随机号码序列生成算法实现与比较


一、课题背景

本课题以“抽奖机随机号码生成”为应用场景,实现并比较四种随机抽样算法,包括:

  • 基础随机法

  • 洗牌算法(Fisher–Yates)

  • 加权随机法

  • 批量随机法

目标是学习随机算法原理、实现方式以及效率比较。


二、课程设计目标

1. 知识目标

  • 理解随机算法思想

  • 掌握 Fisher–Yates 洗牌算法

  • 能用 C++ 生成无重复随机序列

  • 了解加权随机抽取的概率控制方法

2. 能力目标

  • 提升编程实现能力

  • 能分析不同算法的复杂度和适用性


三、算法原理

1. 基础随机法

不断生成随机数,若不重复则加入结果。
缺点:查重开销大,效率低。

2. 洗牌算法(Fisher–Yates)

步骤:

  1. 构建完整号码池

  2. 从后向前遍历

  3. [0..i]随机位置交换

  4. 取最后 k 个作为结果

优点:等概率、高效率。

3. 加权随机法

通过权重控制被选中的概率,用于“某些号码更容易中”的场景。

4. 批量随机法

一次生成一批随机数,统一去重,提高效率。


四、程序设计与实现(C++)

#include <iostream> #include <vector> #include <unordered_set> #include <algorithm> #include <ctime> #include <numeric> using namespace std; // ====================== 方法1:基础随机法 ====================== vector<int> randomDraw_basic(int min_num, int max_num, int k) { vector<int> result; if (min_num > max_num || k <= 0 || k > (max_num - min_num + 1)) { return result; } int total_num = max_num - min_num + 1; while (result.size() < k) { int num = rand() % total_num + min_num; bool is_duplicate = false; for (int v : result) { if (v == num) { is_duplicate = true; break; } } if (!is_duplicate) { result.push_back(num); } } return result; } // ====================== 方法2:洗牌算法 ====================== vector<int> randomDraw_shuffle(int min_num, int max_num, int k) { vector<int> pool; for (int i = min_num; i <= max_num; ++i) { pool.push_back(i); } int n = pool.size(); if (k >= n) return pool; for (int i = n - 1; i >= n - k; --i) { int rand_idx = rand() % (i + 1); swap(pool[i], pool[rand_idx]); } return vector<int>(pool.end() - k, pool.end()); } // ====================== 方法3:加权随机法 ====================== vector<int> randomDraw_weighted(int min_num, int max_num, int k, const vector<double>& weights) { vector<int> result; unordered_set<int> used; double total_weight = accumulate(weights.begin(), weights.end(), 0.0); while (result.size() < k) { double r = (rand() / (double)RAND_MAX) * total_weight; double cur = 0.0; int selected = -1; for (int i = 0; i < weights.size(); ++i) { cur += weights[i]; if (cur >= r) { selected = min_num + i; break; } } if (selected != -1 && used.find(selected) == used.end()) { used.insert(selected); result.push_back(selected); } } return result; } // ====================== 方法4:批量随机法 ====================== vector<int> randomDraw_batch(int min_num, int max_num, int k) { vector<int> result; unordered_set<int> used; int total_num = max_num - min_num + 1; const int BATCH = k * 2; while (result.size() < k) { vector<int> temp; for (int i = 0; i < BATCH; i++) { temp.push_back(rand() % total_num + min_num); } for (int num : temp) { if (used.find(num) == used.end()) { used.insert(num); result.push_back(num); if (result.size() == k) break; } } } return result; } void printResult(const vector<int>& nums, const string& name) { cout << "【" << name << "】:"; for (int v : nums) cout << " " << v; cout << endl; } int main() { srand((unsigned)time(nullptr)); const int MIN = 1, MAX = 50, K = 6; vector<double> weights(MAX - MIN + 1, 1.0); for (int i = 0; i < weights.size(); i++) { if (MIN + i >= 20 && MIN + i <= 30) { weights[i] = 3.0; } } printResult(randomDraw_basic(MIN, MAX, K), "基础随机法"); printResult(randomDraw_shuffle(MIN, MAX, K), "洗牌算法"); printResult(randomDraw_weighted(MIN, MAX, K, weights), "加权随机法"); printResult(randomDraw_batch(MIN, MAX, K), "批量随机法"); return 0; }

五、运行结果示例

【基础随机法】: 5 13 27 40 48 2 【洗牌算法】: 10 21 6 34 8 49 【加权随机法】: 22 27 25 6 30 41 【批量随机法】: 7 16 29 11 3 44

六、结果分析

  • 基础随机法:实现简单,但效率最低。

  • 洗牌算法:随机性最强,效率最高,工程最常用。

  • 加权随机法:可人为控制概率,结果偏向权重高的区间。

  • 批量随机法:性能介于基础法和洗牌法之间。


七、课程设计总结

通过本次课程设计,我掌握了随机算法的实现方式,并理解了:

  • 随机数生成不仅是调用 rand(),还需关注均匀性和去重方式

  • Fisher–Yates 是真正保证等概率的算法

  • 加权抽取可灵活实现概率控制

  • 批量生成可显著提高效率

本次课设提高了我的算法能力、工程实现能力以及团队合作能力。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/12 19:37:46

Blender虚幻引擎PSK/PSA文件导入实战:从零解决动画播放问题

Blender虚幻引擎PSK/PSA文件导入实战&#xff1a;从零解决动画播放问题 【免费下载链接】io_scene_psk_psa A Blender plugin for importing and exporting Unreal PSK and PSA files 项目地址: https://gitcode.com/gh_mirrors/io/io_scene_psk_psa 还在为Blender中导入…

作者头像 李华
网站建设 2026/3/11 5:23:19

Wan2.2-T2V-A14B与Runway Gen-3的适用边界在哪里?

Wan2.2-T2V-A14B与Runway Gen-3的适用边界在哪里&#xff1f; 在短视频日活突破十亿、品牌内容竞争进入“秒级注意力”时代的今天&#xff0c;AI生成视频已不再是实验室里的概念玩具&#xff0c;而是实实在在影响创作效率和商业产出的核心工具。从抖音信息流广告到电影预演分镜…

作者头像 李华
网站建设 2026/3/13 9:34:16

数据资产治理:构建企业级数据管理体系的7个关键步骤

数据资产治理&#xff1a;构建企业级数据管理体系的7个关键步骤 关键词&#xff1a;数据治理、数据资产管理、企业级数据管理、数据质量、数据安全、数据战略、数据治理框架 摘要&#xff1a;在数字经济时代&#xff0c;数据已成为企业的核心战略资产。本文深入探讨了构建企业…

作者头像 李华
网站建设 2026/3/13 1:36:18

Wan2.2-T2V-A14B在智能制造工厂巡检动画中的细节刻画

Wan2.2-T2V-A14B在智能制造工厂巡检动画中的细节刻画引言&#xff1a;当文字开始“动”起来——工业可视化的新范式 在一座现代化的智能制造工厂里&#xff0c;每天都有成百上千条设备状态信息、巡检记录和报警日志被系统采集。但这些冷冰冰的数据背后&#xff0c;隐藏着一个长…

作者头像 李华
网站建设 2026/3/12 1:06:51

21、企业资源管理中的网络服务与资源管理基础设施

企业资源管理中的网络服务与资源管理基础设施 一、网络服务在 ERP 解决方案中的应用 1.1 电子商务与 ERP 的发展背景 电子商务技术为个人和企业带来了全新的合作与协作方式,催生了众多新的商业模式和就业机会。自 20 世纪 90 年代末以来,企业越来越依赖互联网和基于网络的…

作者头像 李华
网站建设 2026/3/10 16:06:26

ZenTimings完整使用指南:轻松掌握AMD Ryzen处理器的终极监控技巧

ZenTimings完整使用指南&#xff1a;轻松掌握AMD Ryzen处理器的终极监控技巧 【免费下载链接】ZenTimings 项目地址: https://gitcode.com/gh_mirrors/ze/ZenTimings 想要深入了解您的AMD Ryzen处理器运行状态吗&#xff1f;ZenTimings作为一款专为AMD平台设计的免费性…

作者头像 李华