可控的金币随机掉落算法

需求是这样的,我们设计好了一个副本,里面怪物和怪的数量已经确定了,就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);


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值