首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于数组中最常见数字的权重选择

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

Stack Overflow用户
提问于 2022-06-18 18:26:05
回答 1查看 52关注 0票数 1

我试图找出如何根据数组中最频繁的数字来计算“权重选择”,以便AI选择一个特定的数字。

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

就目前情况而言,如果最常见的数字是1,则有50%的机会选择2。理想情况下,如果数组中满是1s,则只应该有50%的机会出现。

有谁能解决这个问题吗?我还没能解决这个问题。感谢你的帮助。

P.S:我知道这个函数写得很糟糕,只是想得到一个原型/骨架函数。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-18 18:46:41

这看起来是std::discrete_distribution的最佳选择。

演练:

代码语言:javascript
复制
#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,因为它更容易处理。

代码语言:javascript
复制
    // filled with some example choices:
    std::vector<int> m_playerChoices{10,10,11,10,22,22,10};

我首先要做一个直方图,这样您就可以得到每个选项的计数:

代码语言:javascript
复制
    std::map<int, int> hist;

    for(int choice : m_playerChoices) {
        ++hist[choice];
    }

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

代码语言:javascript
复制
    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

代码语言:javascript
复制
    std::discrete_distribution<int> dist(weights.begin(), weights.end());

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

代码语言:javascript
复制
    for(int i = 0; i < 100; ++i) {
        std::cout << unique_choices[dist(gen)] << '\n';
    }
}

演示

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72671703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档