根据给定的概率分布从集合中提取值
Posted
技术标签:
【中文标题】根据给定的概率分布从集合中提取值【英文标题】:Extract values from a set according to a given probability distribution 【发布时间】:2017-07-22 16:28:47 【问题描述】:我必须解决这个问题:
vector<int> myset=1,2,3,4;
vector<double> distribution =0.01,0.1,0.3,0.59;
我必须根据给定的分布从myset中选择一些值。实际上 distribution 和 myset 并不固定。它们具有相同的维度,但是这个维度可以改变并且也很大。我可以在 [0 100] 范围内统一提取一个数字,然后这样做:
int extracted_numb;
int numb = rand(0,100);
if(numb<1)
extracted_numb=myset[0];
else if(numb<11)
extracted_numb=myset[1];
else if(numb<41)
extracted_numb=myset[2];
else
extracted_numb=myset[3];
但我再说一遍,我不知道实际情况下 distribution 和 myset 的维度(因为是用户参数),因此我不知道有多少if要做。
我问是否有一个很好的算法来解决这个问题,也许一些 C++ 或 Boost 的本地库已经完成了它
(我使用的是 Boost 1.63 和 C++11)
【问题讨论】:
【参考方案1】:在 C++11 中,使用 random::discrete_distribution
选择索引到 myset
。 (Boost 也有类似的功能。)
示例(改编自 cppreference 链接):
#include <iostream>
#include <map>
#include <random>
#include <vector>
int main()
std::vector<int> myset = 10,22,35,47;
std::vector<double> distribution = 0.01,0.1,0.3,0.59;
std::random_device rd;
std::mt19937 gen(rd());
std::discrete_distribution<> d(distribution.begin(), distribution.end());
std::map<int, int> m;
for(int n=0; n<10000; ++n)
++m[myset[d(gen)]];
for(auto p : m)
std::cout << p.first << " generated " << p.second << " times\n";
(Live on coliru)
【讨论】:
令人印象深刻的时机。我知道这个,但是 5 分钟对我来说太快了 非常聪明的解决方案。正是我想要的。非常感谢以上是关于根据给定的概率分布从集合中提取值的主要内容,如果未能解决你的问题,请参考以下文章