您的位置:首页 > 其它

可控的金币随机掉落算法

2016-03-21 12:55 513 查看
需求是这样的,我们设计好了一个副本,里面怪物和怪的数量已经确定了,就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;
}

常量 c_min_package 是我们定制的最小金币量
参数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);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 游戏