个人网站创建与管理,网站地图 百度,wordpress分类目录和标签的作用,程序员wordpress主题抽奖机随机号码序列生成算法实现与比较 一、课题背景
本课题以“抽奖机随机号码生成”为应用场景#xff0c;实现并比较四种随机抽样算法#xff0c;包括#xff1a; 基础随机法 洗牌算法#xff08;Fisher–Yates#xff09; 加权随机法 批量随机法
目标是学习随机…抽奖机随机号码序列生成算法实现与比较一、课题背景本课题以“抽奖机随机号码生成”为应用场景实现并比较四种随机抽样算法包括基础随机法洗牌算法Fisher–Yates加权随机法批量随机法目标是学习随机算法原理、实现方式以及效率比较。二、课程设计目标1. 知识目标理解随机算法思想掌握 Fisher–Yates 洗牌算法能用 C 生成无重复随机序列了解加权随机抽取的概率控制方法2. 能力目标提升编程实现能力能分析不同算法的复杂度和适用性三、算法原理1. 基础随机法不断生成随机数若不重复则加入结果。缺点查重开销大效率低。2. 洗牌算法Fisher–Yates步骤构建完整号码池从后向前遍历与[0..i]随机位置交换取最后 k 个作为结果优点等概率、高效率。3. 加权随机法通过权重控制被选中的概率用于“某些号码更容易中”的场景。4. 批量随机法一次生成一批随机数统一去重提高效率。四、程序设计与实现C#include iostream #include vector #include unordered_set #include algorithm #include ctime #include numeric using namespace std; // 方法1基础随机法 vectorint randomDraw_basic(int min_num, int max_num, int k) { vectorint 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洗牌算法 vectorint randomDraw_shuffle(int min_num, int max_num, int k) { vectorint 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 vectorint(pool.end() - k, pool.end()); } // 方法3加权随机法 vectorint randomDraw_weighted(int min_num, int max_num, int k, const vectordouble weights) { vectorint result; unordered_setint 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批量随机法 vectorint randomDraw_batch(int min_num, int max_num, int k) { vectorint result; unordered_setint used; int total_num max_num - min_num 1; const int BATCH k * 2; while (result.size() k) { vectorint 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 vectorint 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; vectordouble 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 是真正保证等概率的算法加权抽取可灵活实现概率控制批量生成可显著提高效率本次课设提高了我的算法能力、工程实现能力以及团队合作能力。