设置获取随机项目的机会(C ++)?

时间:2017-07-28 09:53:51

标签: c++ class random

我有5个班级(传奇鸡蛋,稀有鸡蛋,普通鸡蛋,龙食,金)。从Item类继承的所有项。

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

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!";
}

但我觉得这样效率会有点低,因为我被告知要避免阻塞其他问题。

*这些项目属于他们自己(单独)的课程,因为他们有不同的能力

2 个答案:

答案 0 :(得分:7)

现代C ++方式see

#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 << " times\n";
    }
}

只需致电d(gen)即可获得一个具有所需分布的项目(0 ='传奇鸡蛋'等)。

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

答案 1 :(得分:1)

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

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

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

E.g。 0.15位于0.01 + 0.100.01 + 0.10 + 0.20之间,因此upper_bound将找到0.01 + 0.10 + 0.20的迭代器。根据预期,很容易看到这种情况发生的可能性为20%。