2

给定一堆字符串,我正在尝试创建一个程序,该程序可以根据我的输入模拟具有加权分布的伪随机行为。

到目前为止,我想出了这个

#include <iostream>
#include <random>
#include <type_traits>
#include <map>
#include <vector>
#include <string>
#include <initializer_list>

#define N 100

int main()
{
    std::vector<std::string> interval{"Bread", "Castle", "Sun"};
    std::vector<float> weights { 0.40f, 0.50f, 0.10f };
    std::piecewise_constant_distribution<> dist(interval.begin(),
                                                interval.end(),
                                                weights.begin());

    std::random_device rd;
    std::mt19937 gen(rd()) ;

    for(int i = 0; i<N;i++)
    {
        std::cout << dist(gen) << "\n";
    }

    return(0);

}

但是这个东西不起作用,我不知道为什么,std::piecewise_constant_distribution根据在线示例,它的通常用法是 with std::arrays,但我正在尝试使用它来实现它std::vector,这是我发现的主要区别。

使用 Clang++ 的错误输出是

/usr/bin/../lib/gcc/x86_64-linux-gnu/4.7/../../../../include/c++/4.7/bits/random.tcc:2409:10: error: no matching member function for
      call to 'push_back'
                _M_int.push_back(*__bbegin);
                ~~~~~~~^~~~~~~~~

但我无法理解它,因为.push_back我的代码中没有明确的内容,我也没有从其中得到什么,因为调试模板类是一场噩梦,我只是从这个开始。

任何人都知道为什么代码不起作用?

4

2 回答 2

3

默认结果类型std::piecewise_constant_distributionRealTypedouble此处)。似乎您正在尝试从string具有不同权重的 3 个选项中进行选择,但这不是std::piecewise_constant_distribution目的。它旨在从具有给定权重的数字区间生成统一的随机值。如果您修改示例并更改interval为:

std::vector<double> interval {1, 3, 5, 10, 15, 20};

一切都会愉快地编译。从外观上看,您想要std::discrete_distribution

...

std::vector<std::string> interval{"Bread", "Castle", "Sun"};
std::vector<float> weights { 0.40f, 0.50f, 0.10f };
std::discrete_distribution<> dist(weights.begin(), weights.end());

std::mt19937 gen(rd());

for(int i = 0; i<N;i++)
{
    std::cout << interval[dist(gen)] << "\n";
}

...
于 2013-05-13T01:25:01.347 回答
1
于 2013-05-13T01:29:39.820 回答