需求是这样的,我们设计好了一个副本,里面怪物和怪的数量已经确定了,就100只吧,现在我们想让怪物随机得掉落金币,但是一个副本掉落金币的总量需要精确控制到10000金。那么算法应该怎么写?突然觉得很像微信抢红包的算法。
要实现起来,方法很多,这里记录一个我觉得最简单有效的办法。
const int c_min_package = 20;
int DropsManager::dropsCoin(int leftmoney, int leftcount)
{
int money = 0;
assert(leftmoney > 1);
if(leftcount == 1)
{
leftcount--;
money = leftmoney;
}
else
{
float max = leftmoney / leftcount * 2; //最多拿两人份
money = CCRANDOM_0_1() * max;
if(money < c_min_package)
money = c_min_package;
}
return money;
}
参数1. leftmoney 剩余金币总量
参数2. leftcount 剩余分金币的人的数量
测试代码跑一下
int totalmon = 10000;
int totalpackage = 100;
int leftmoney = totalmon;
int leftpackage = totalpackage;
int totalmon2 = 0;
for(int index = 1; index <= totalpackage; index++)
{
int drop = DM()->dropsCoin(leftmoney, leftpackage);
CCLOG("[%d] drop %d", index, drop);
leftmoney -= drop;
if(drop > 0)
leftpackage--;
totalmon2 += drop;
}
assert(totalmon2 == totalmon);