【发布时间】:2016-02-18 06:03:44
【问题描述】:
所以我正在开发一款在线游戏,这款游戏的特色之一(与许多其他 MMORPG 一样)是掉落系统和升级系统。
掉落系统决定了怪物被杀死时会掉落哪些物品。 升级系统决定一个项目是否会成功升级到下一个级别。
他们都需要能够使用概率来确定:
- 物品掉落
- 物品升级成功。
我开发了一个系统,可以生成一个介于 0 和 100000 之间的随机数。在这个系统中,上述任何一种情况发生的 1% 的概率用 1000 表示。同样,0.5% 的概率是 500... 50% 就是 50000。
这是这段代码的核心......
int RandomValueInRange(const int start, const int end)
{
std::random_device rd;
std::mt19937 generator(rd());
const int stable_end = ((end < start) ? start : end);
std::uniform_int_distribution<int> distribution(start, stable_end);
return distribution(generator);
}
现在,如果一件物品成功掉落或升级,我需要做的就是这个...
const int random_value = RandomValueInRange(0, 100000);
const int probability = item.GetProbability();//This simply returns an integer stored in a config file which represents the probability of this item being dropped/upgraded.
if(random_value <= probability)
{
std::cout << "Probability Success!" << endl;
}
else
{
std::cout << "Probability Failed!" << endl;
}
我希望上述方法可以正常工作,但无论出于何种原因,它似乎都有问题......玩家能够轻松获得概率为 0.1% 的物品(这几乎永远不会发生!)。
有谁知道更好的系统或我如何改进这个系统以真正遵循概率指南......
【问题讨论】:
-
0.1% 的概率并不是真的“几乎从不”,它预计每 1000 次试验会发生 1 次。如果你有 100 名玩家,他们每个人每天杀死 10 件东西,那么你会期望有 1 人每天获得这样的物品掉落。而大约4个月后,基本上每个人都得到了这样的下降。
-
你似乎在这里重新发明轮子。如果您需要 1000 分之一的机会,请使用
uniform_int_distribution(0, 1000)并检查它是否出现 0。如果您需要 500 分之一的机会,请使用uniform_int_distribution(0, 500)。换句话说,直接做对。您似乎正在使用uniform_int_distribution(0, 100000),然后必须修复 1/100000 的机会。 (对于 M 中的 N 机会,您检查结果是否为
标签: c++ random probability