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()がかかるので、std Generator &::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 に答える