可控的金币随机掉落算法
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);
要实现起来,方法很多,这里记录一个我觉得最简单有效的办法。
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);
相关文章推荐
- 我是运营,我没有假期
- 每个 Linux 游戏玩家都绝不想要的恼人体验
- 在 Fedora 上使用 Steam play 和 Proton 来玩 Windows 游戏
- 书评:《算法之美( Algorithms to Live By )》
- Steam 让我们在 Linux 上玩 Windows 的游戏更加容易
- 如何使用 Steam Play 在 Linux 上玩仅限 Windows 的游戏
- 新一代iPad适配应用之游戏篇
- 动易2006序列号破解算法公布
- VB实现的《QQ美女找茬游戏》作弊器实例
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现洗牌游戏实例
- C#实现的算24点游戏算法实例分析
- C#实现简单的井字游戏实例