基于数组中最常见的数字的权重选择



我正试图找出如何根据数组中最常见的数字来计算"权重选择",以供AI选择特定的数字。

例如,我有这样一个函数,它计算数组中最常见的数字,并允许AI选择一个特定的选项,使玩家失败。

现在,如果最常见的数字是1,则有50%的机会选择2。理想情况下,如果数组中全是1,那么它应该只有50%的机会发生。

有人有解决办法吗?我还没能解决这个问题。谢谢你的帮助。

p。S:我知道这个函数可能写得很糟糕,只是想得到一个原型/框架函数。

这看起来是std::discrete_distribution的完美地方。

介绍:

#include <algorithm>
#include <iostream>
#include <map>
#include <random>
#include <vector>
// A seeded pseudo random number generator:
static std::mt19937 gen(std::random_device{}());
int main() {

假设你在vector中拥有所有玩家的选择。你似乎把它们放在一个数组中,但我将使用vector,因为它更容易处理。

// filled with some example choices:
std::vector<int> m_playerChoices{10,10,11,10,22,22,10};

我会先做一个直方图,这样你就能得到每个选择的数量:

std::map<int, int> hist;
for(int choice : m_playerChoices) {
++hist[choice];
}

然后我们从直方图中提取选择和计数,并放入两个单独的vectors。一个包含所有唯一选项,另一个对应的包含每个选项的计数,称为weights

std::vector<int> unique_choices;
std::vector<int> weights;
for(auto[choice, count] : hist) {
unique_choices.push_back(choice);
weights.push_back(count);    
}

weights然后被用来创建discrete_distribution:

std::discrete_distribution<int> dist(weights.begin(), weights.end());

你现在可以调用伪随机数生成器,并使用这个离散分布来获得一个唯一的数字,每个数字的概率将完全根据你开始时的每个选择的计数:

for(int i = 0; i < 100; ++i) {
std::cout << unique_choices[dist(gen)] << 'n';
}
}

演示

最新更新