我试图找出如何根据数组中最频繁的数字来计算“权重选择”,以便AI选择一个特定的数字。
例如,我有一个函数,它计算数组中最常见的数字,并允许AI选择一个特定的选项来使玩家输掉。
就目前情况而言,如果最常见的数字是1,则有50%的机会选择2。理想情况下,如果数组中满是1s,则只应该有50%的机会出现。
有谁能解决这个问题吗?我还没能解决这个问题。感谢你的帮助。
P.S:我知道这个函数写得很糟糕,只是想得到一个原型/骨架函数。
发布于 2022-06-18 18:46:41
这看起来是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];
}然后,我们从直方图中提取选择和计数,并放入两个独立的vector,一个包含所有唯一选项,另一个包含每个选项的计数,称为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';
}
}https://stackoverflow.com/questions/72671703
复制相似问题