【问题标题】:Setting Chance of getting Items for Random (C++)?设置随机获取项目的机会(C++)?
【发布时间】:2018-01-04 08:04:41
【问题描述】:

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

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

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

【问题讨论】:

  • 为什么效率会低?
  • 但是我觉得效率会有点低。你为什么会有这种感觉?
  • “因为我被告知要避免使用 if else 块”什么?为什么?
  • @DimChtz 已编辑!我的老师还告诉我,如果不这样,继续写可能会很乏味,并且可能有更好、更有效的方法,因为我可以有 100 个项目。
  • 你的百分比加起来不应该是 100%,而不是 80%?

标签: c++ class random


【解决方案1】:

现代 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%。

【讨论】:

    【解决方案2】:

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

    {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%,正如预期的那样。

    【讨论】:

      猜你喜欢
      • 2017-12-22
      • 1970-01-01
      • 1970-01-01
      • 2011-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多