C++ 微信红包程序实现:公平分配吉利红包
C++ 微信红包程序实现:公平分配吉利红包
本程序旨在使用 C++ 编程语言实现一个微信红包程序,将给定的金额拆分成多个吉利数字红包,并以相对均匀的方式分配给指定人数。程序考虑了吉利数字、金额分配和随机打乱等因素,力求实现公平的红包分配。
思路:
- 定义一个函数,用于生成吉利数的数组,该函数返回一个
vector<double>类型的值。 - 定义一个函数,用于计算每个红包的金额,该函数返回一个
vector<double>类型的值。 - 定义一个函数,用于分配红包金额给每个人,该函数返回一个
vector<double>类型的值。 - 在
main函数中,读入钱数m和发红包人数n,调用以上三个函数,输出每个人分到的红包数。
代码:
#include <iostream>
#include <vector>
#include <algorithm>
#include <random>
#include <cmath>
using namespace std;
// 生成吉利数的函数
vector<double> generateLuckyNumbers() {
vector<double> luckyNumbers {
1.66, 1.68, 16.8, 1.78, 17.8, 1.88, 18.8, 1.99,
5.20, 0.66, 6.6, 6.66, 0.08, 0.88, 8.8, 8.88,
0.99, 9.9, 9.99
};
return luckyNumbers;
}
// 计算每个红包的金额
vector<double> calculateRedPacketAmounts(double totalAmount, int numPackets) {
vector<double> luckyNumbers = generateLuckyNumbers();
vector<double> amounts;
double sumAmounts = 0;
for (int i = 0; i < numPackets; i++) {
double amount = luckyNumbers[i % luckyNumbers.size()];
amounts.push_back(amount);
sumAmounts += amount;
}
double scale = totalAmount / sumAmounts;
for (int i = 0; i < numPackets; i++) {
amounts[i] *= scale;
}
return amounts;
}
// 分配红包金额给每个人
vector<double> distributeRedPacketAmounts(vector<double> amounts, int numPeople) {
random_device rd;
mt19937 gen(rd());
shuffle(amounts.begin(), amounts.end(), gen);
vector<double> perPersonAmounts(numPeople);
int idx = 0;
for (int i = 0; i < amounts.size(); i++) {
perPersonAmounts[idx++] += amounts[i];
if (idx >= numPeople) {
idx = 0;
}
}
return perPersonAmounts;
}
int main() {
double totalAmount;
int numPackets;
cin >> totalAmount >> numPackets;
vector<double> amounts = calculateRedPacketAmounts(totalAmount, numPackets);
vector<double> perPersonAmounts = distributeRedPacketAmounts(amounts, numPackets);
for (int i = 0; i < perPersonAmounts.size(); i++) {
cout << "Person " << i+1 << " gets " << round(perPersonAmounts[i]) << " yuan." << endl;
}
return 0;
}
代码解释:
generateLuckyNumbers()函数用于生成一个包含预设吉利数字的vector。calculateRedPacketAmounts()函数首先根据红包数量从吉利数字数组中选择合适的数字,并计算每个红包的金额。然后,根据总金额和红包金额总和,进行比例调整,确保红包金额总和等于总金额。distributeRedPacketAmounts()函数首先使用随机数生成器随机打乱红包金额数组,然后按照轮流分配的方式将红包金额分配给每个人。main函数用于读取总金额和红包数量,调用以上函数进行红包分配,并输出每个人的红包金额。
使用方法:
- 将代码保存为
.cpp文件。 - 使用 C++ 编译器编译代码,例如
g++ redpacket.cpp -o redpacket。 - 运行可执行文件,例如
./redpacket。 - 在提示符中输入总金额和红包数量,程序将输出每个人的红包金额。
注意:
- 由于吉利数字的设定和随机分配,每个人的红包金额可能略有不同。
- 程序仅作为示例,实际应用中可能需要根据具体需求进行调整。
原文地址: https://www.cveoy.top/t/topic/nVYW 著作权归作者所有。请勿转载和采集!