1.微信红包算法
代码大致意思是这样的:假设有100元钱,分给十个人。那么第一个人获得红包大小怎么计算呢?100/10 = 10元。这是期望值。从0.01到20的区间中(其中20=10乘以2)随机抽取一个数,就是第一个人获得红包的大小。假设第一个人获得了15元,那么剩下的85元平均分给9个人,这九个人平均获得红包大小为9.4元,那么第二个人的红包大小均匀分布于0.01元到18.80元的区间中,依次类推。算法保证最后一个人至少抽到0.01元。
微信红包的代码c++
class LeftMoneyPackage
{
public:
LeftMoneyPackage(int size, int money); //初始化个数和金额
~LeftMoneyPackage();
double getRandomMoney(); //微信红包算法
double getRandomMoney_1(); //上下限红包算法
private:
double remainSize; //剩余的个数
double remainMoney; //剩余金额
//上下限法用一下参数
double SMIN; //下限
double SMAX; //上限
const int N = 99; //用于rand();
};
LeftMoneyPackage::LeftMoneyPackage(int size, int money) //初始化
{
remainSize = size;
remainMoney = money;
SMIN = (remainMoney / remainSize) * 0.1;
SMAX = (remainMoney / remainSize) * 1.9;
}
LeftMoneyPackage::~LeftMoneyPackage()
{
}
double LeftMoneyPackage::getRandomMoney() { //微信红包算法
if (remainSize == 1) { //最后一个红包
remainSize--;
return (double)remainMoney;
}
double min = 0.01; //最小值
//cout << "remainMoney : " << remainMoney << endl;
//cout << "remainSize : " << remainSize << endl;
double max = remainMoney / remainSize * 2; //最大值
//cout << "max : " << max << endl;
double money = ((rand() % N + 1) / (double)(N + 1))*max; //随机得到一个值
money = money <= min ? 0.01 : money;
money = floor(money * 100) / 100;
remainMoney -= money;
remainSize--;
return money;
}
2.需求分析与实现-带上下限对称随机红包算法
假设总金币数量为S1,总份数为P1,已发币量为S2,已发份数为P2,则:
平均值为S1/P1,则随机下限SMIN=(S1/P1)*0.1,随机上限SMAX=(S1/P1)*1.9。
设生成的第n个随机币值为X,剩余获取总值为Y,则剩余币S1-S2=X+Y,当Y取最大值时X取最小值,当Y取最小值时X取最大值,同时X应处于限定随机上下限(SMIN~SMAX)之间,得出:
X的随机范围为:MAX(S1–S2-(P1–P2-1)*SMAX,SMIN)<=X<=MIN(S1–S2–(P1–P2-1)*SMIN,SMAX)
double LeftMoneyPackage::getRandomMoney_1() {
if (remainSize == 1) {
remainSize--;
return (double)remainMoney;
}
cout << "上限 :" << min(remainMoney - (remainSize - 1) * SMIN, SMAX) << endl;
cout << "下限 :" << max(remainMoney - (remainSize - 1) * SMAX, SMIN)<< endl;
double money = ((rand() % N + 1) / (double)(N + 1)) * (min(remainMoney-(remainSize-1)* SMIN,SMAX) - max(remainMoney - (remainSize - 1) * SMAX,SMIN)) + max(remainMoney - (remainSize - 1) * SMAX, SMIN);
remainSize--;
remainMoney -= money;
return money;
}