可控的金币随机掉落算法

饶明亮
2023-12-01

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


 类似资料: