可控的金币随机掉落算法

来源:互联网 发布:hr数据分析 编辑:程序博客网 时间:2024/04/29 20:46

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