C++11 随机数和 std::bind 以意想不到的方式交互

标签 c++ gcc random c++11 stdbind

我正在使用 GCC 4.6.3 并尝试使用以下代码生成随机数:

#include <random>
#include <functional>

int main()
{
    std::mt19937 rng_engine;

    printf("With bind\n");
    for(int i = 0; i < 5; ++i) {
        std::uniform_real_distribution<double> dist(0.0, 1.0);
        auto rng = std::bind(dist, rng_engine);
        printf("%g\n", rng());
    }

    printf("Without bind\n");
    for(int i = 0; i < 5; ++i) {
        std::uniform_real_distribution<double> dist(0.0, 1.0);
        printf("%g\n", dist(rng_engine));
    }

    return 0;
}

我希望这两种方法都能生成一个包含 5 个随机数的序列。相反,这是我实际得到的:

With bind
0.135477
0.135477
0.135477
0.135477
0.135477
Without bind
0.135477
0.835009
0.968868
0.221034
0.308167

这是 GCC 错误吗?还是与 std::bind 有关的一些微妙问题?如果是这样,您能理解结果吗?

谢谢。

最佳答案

绑定(bind)时,会生成 rng_engine 的拷贝。如果你想传递引用,这是你必须做的:

auto rng = std::bind(dist, std::ref(rng_engine));

关于C++11 随机数和 std::bind 以意想不到的方式交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14023880/

相关文章:

c++ - 不理解编译器的行为

java - 随机生成的 X 数

c++ - 计算BMI程序

c - 易失/修改的返回地址

c++ - 如何按取消引用的值对集合进行排序?

c - 更新使用 "-Bsymbolic"链接器选项生成的 ELF 共享对象

ios - 我需要随机的几何形状、 Material 或其他东西吗? - 场景套件, swift

c++ - 将 "__m256 with random-bits"转换为 [0, 1] 范围的浮点值

c++ - 我可以修改 std::priority_queue 以增加重复数据的计数吗?

c++ - C++多线程程序中的串行代码执行