设置随机获得物品的几率(C++)?

Setting Chance of getting Items for Random (C++)?

本文关键字:几率 C++ 随机 设置      更新时间:2023-10-16

我有5个职业(传奇蛋,稀有蛋,普通蛋,龙食,金币(。从 Item 类继承的所有项。

假设,输出是用户正在玩扭蛋机器,他们可以在其中获得任何这些物品。但我想设置获得特定物品的机会百分比,这样获得稀有物品就不会那么容易了。

Legendary Egg = 1%
Rare Egg = 10%
Common Egg = 20%
Dragon Food = 20%
Gold = 29%

什么是有效的方法?起初我将所有项目放在一个数组中并使用 rand((%,但我意识到我无法设置获取它们的机会。我想使用类似的东西

if (value < 0.1){
std:: cout << "You got a legendary egg!";
}

但我觉得这会有点低效,因为我被告知要避免阻止其他内容。

*物品属于自己的(单独(职业,因为它们具有不同的能力

现代C++方式见

#include <iostream>
#include <map>
#include <random>
int main()
{
std::random_device rd;
std::mt19937 gen(rd());
std::discrete_distribution<> d({1, 10, 20, 20, 29, 20});
std::map<int, int> m;
for(int n=0; n<10000; ++n) {
++m[d(gen)];
}
for(auto p : m) {
std::cout << p.first << " generated " << p.second << " timesn";
}
}

只需致电d(gen)即可获得一件具有所需分配的物品(0 ="传奇蛋"等(。

注意:这些值是权重。你谈到了百分比。这应该加起来是 100,所以我又加了 20%。

一个简单的解决方案是将每个结果的百分比转换为联合表

{0.01, 0.01 + 0.10, 0.01 + 0.10 + 0.20, ... }

现在生成一个介于 0 和 1 之间的数字,看看它落在哪个两个边界之间。生成表很简单;你用std::partial_sum来做这件事。在表格中查找结果也很容易,这就是std::upper_bound的工作。

例如 0.15 介于0.01 + 0.100.01 + 0.10 + 0.20之间,所以upper_bound会找到0.01 + 0.10 + 0.20的迭代器。很容易看出,正如预期的那样,这种情况以 20% 的几率发生。