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

pat*_*lly 7 c++ random gcc stdbind c++11

我正在使用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;
}
Run Code Online (Sandbox Code Playgroud)

我期望两种方法都能生成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
Run Code Online (Sandbox Code Playgroud)

这是GCC的错误吗?或者是与std :: bind有关的一些微妙问题?如果是这样,你能对结果有所了解吗?

谢谢.

Tri*_*ner 12

绑定时,会生成rng_engine的副本.如果要传递引用,则必须执行以下操作:

auto rng = std::bind(dist, std::ref(rng_engine));
Run Code Online (Sandbox Code Playgroud)

  • 不公平,我在收到+1速度之前接到了妈妈的电话. (2认同)
  • 该死的,我不能只是笑着回答:) (2认同)

nur*_*tin 5

std::uniform_real_distribution::operator()采取Generator &所以你将不得不使用std绑定:: REF

#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, std::ref(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));
    }
}
Run Code Online (Sandbox Code Playgroud)