我使用的是 Visual Studio 2013( Debug模式),它没有用于 std::discrete_distribution
的基于迭代器的构造函数,因此我使用了一种解决方法。但是,在使用此解决方法时,如果最后一个元素不大于 weights
中的第一个元素,则会产生运行时错误。
使用初始化列表时不会产生此错误。
例子:
#include <iostream>
#include <random>
#include <vector>
int main(){
std::discrete_distribution<> dist1 = { 10.f,11.f,5.f };
std::cout << "!" << std::endl;
std::vector<float> weights = { 10.f, 11.f, 5.f};
std::size_t i(0);
std::discrete_distribution<> dist2(weights.size(), weights.front(), weights.back(),
[&weights, &i](double){
auto w = weights[i];
++i;
return w;
});
std::cout << "!!" << std::endl;
return 0;
}
Output:
!
invalid range for discrete_distribution
将任何大于 10 的数字添加到 weights
的末尾将停止运行时错误的发生。
为什么会这样?
最佳答案
您正在使用描述的第三个构造函数 here ,即:
template< class UnaryOperation >
discrete_distribution( std::size_t count, double xmin, double xmax,
UnaryOperation unary_op );
std::discrete_distribution
实例的正确初始化需要
delta * 2 = (xmax - xmin) > 0
。
关于c++ - std::discrete_distribution 的意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21973069/