c++ - std::discrete_distribution 的意外行为

标签 c++ algorithm math random std

我使用的是 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/

相关文章:

c++ - 在 C++ 编译时从 CSV 创建 vector

java - 为在任何地方插入而优化的新列表数据结构?

python - 如何将随机数转换为另一种基本格式?

python - 为什么 math.pow 会导致 ValueError : math domain error?

android - 将 C++ 静态库与 android ndk 链接时出错(错误 : file format not recognized)

c++ - 内部/嵌套类-私有(private)和公共(public)之间的区别

c++ - 如何在标准 C++ 中递归地遍历每个文件/目录?

algorithm - 寻找强连通分量?

algorithm - 通过比较两种算法来满足进程进度的临界区算法?

c# - 通用列表的标准偏差?