8

我正在使用 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 有关的一些微妙问题?如果是这样,你能理解结果吗?

谢谢。

4

3 回答 3

14

绑定时,会生成 rng_engine 的副本。如果你想传递一个参考,这就是你必须做的:

auto rng = std::bind(dist, std::ref(rng_engine));
于 2012-12-24T17:00:45.300 回答
5

std::uniform_real_distribution::operator()需要 aGenerator &所以你必须使用 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));
    }
}
于 2012-12-24T17:01:03.263 回答
2

bind()用于重复使用。

把它放在循环之外......

std::mt19937 rng_engine;
std::uniform_real_distribution<double> dist(0.0, 1.0);
auto rng = std::bind(dist, rng_engine);

for(int i = 0; i < 5; ++i) {
    printf("%g\n", rng());
}

...给了我预期的结果:

0.135477
0.835009
0.968868
0.221034
0.308167
于 2016-01-28T19:43:28.497 回答