C++抽奖系统:实现随机抽取奖品的完整代码
C++抽奖系统:实现随机抽取奖品的完整代码
想用C++做一个公平公正的抽奖系统?没问题!这篇文章提供了一个简单易懂的C++抽奖系统代码,可以设置多种奖品,并实现随机抽取,并在控制台输出中奖信息。
#include <iostream>
#include <vector>
#include <random>
#include <chrono>
// 定义奖品结构体
struct Prize {
std::string name;
int quantity;
};
// 初始化奖品列表
std::vector<Prize> initializePrizes() {
std::vector<Prize> prizes;
// 添加奖品,可以根据需要自行修改和扩展
Prize prize1 = { '奖品1', 5 };
Prize prize2 = { '奖品2', 3 };
Prize prize3 = { '奖品3', 2 };
prizes.push_back(prize1);
prizes.push_back(prize2);
prizes.push_back(prize3);
return prizes;
}
// 抽奖函数
void drawPrize(std::vector<Prize>& prizes) {
std::random_device rd;
std::mt19937 gen(rd());
// 计算奖品总数
int totalPrizes = 0;
for (const auto& prize : prizes) {
totalPrizes += prize.quantity;
}
if (totalPrizes > 0) {
std::uniform_int_distribution<> dis(1, totalPrizes);
int chosenNumber = dis(gen);
// 根据随机数选择奖品
int accumulatedPrizes = 0;
for (auto& prize : prizes) {
accumulatedPrizes += prize.quantity;
if (chosenNumber <= accumulatedPrizes) {
std::cout << '恭喜你中得奖品:' << prize.name << std::endl;
prize.quantity--;
break;
}
}
} else {
std::cout << '很抱歉,奖品已经抽完了!' << std::endl;
}
}
int main() {
std::vector<Prize> prizes = initializePrizes();
// 设置随机数生成器的种子为当前时间以获取更好的随机性
std::srand(std::chrono::system_clock::now().time_since_epoch().count());
// 模拟抽奖
for (int i = 0; i < 10; i++) {
std::cout << '第 ' << i+1 << ' 次抽奖结果:' << std::endl;
drawPrize(prizes);
std::cout << std::endl;
}
return 0;
}
代码解释:
- 定义奖品结构体:
Prize结构体包含奖品名称 (name) 和数量 (quantity)。 - 初始化奖品列表:
initializePrizes函数用于初始化奖品列表,可以根据需要添加或修改奖品信息。 - 抽奖函数:
drawPrize函数负责随机抽取奖品。- 首先,计算所有奖品的总数。
- 然后,使用
std::uniform_int_distribution生成一个随机数,范围在 1 到奖品总数之间。 - 最后,遍历奖品列表,根据随机数确定中奖的奖品,并输出中奖信息。
- 主函数:
main函数中演示了如何使用drawPrize函数进行抽奖。
改进之处:
- 使用
<chrono>库中的当前时间来设置随机数生成器的种子,以增加随机性。 - 使用
std::srand函数来设置随机数生成器的种子。 - 将
prizes向量中的奖品设为非常量引用,以便在抽奖函数中修改奖品数量。
你可以根据自己的需求对代码进行修改和扩展,例如添加用户界面、数据库连接等功能。
原文地址: https://www.cveoy.top/t/topic/N1w 著作权归作者所有。请勿转载和采集!