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

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

但我觉得这会有点低效,因为我被告知要避免使用 if else block 。

*这些元素属于它们自己的(单独的)类,因为它们具有不同的能力

最佳答案

现代 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 = 'Legendary Egg' 等等)。

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

关于c++ - 设置随机获取项目的机会(C++)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45370328/

相关文章:

Sass中数组的随机颜色

c++ - 将字符串转换为整数、 double 、 float 而无需捕获异常

c++ - 在多线程程序中使用 exprtk

excel - 使用类模块在类型内输入

.net - 为什么我需要 Typescript 中的泛型

haskell - 在 Haskell 中映射 IO

c++ - 如果 x 和 y 分别是值为 1 和 2 的两个整数。语句 y= - -x-- 是什么意思?

c++ - Qt 中的打印预览

Java 同步静态方法 : lock on object or class

excel - 在线性同余生成器中选择 a、c、m