生成normal_distribution时std :: random中的错误?

时间:2018-08-04 12:37:31

标签: c++ c++11 random normal-distribution

这是我的代码。它假定生成normal_distribution

#include <iostream>
#include <random>
#include <boost/random/mersenne_twister.hpp>
#include <boost/random/normal_distribution.hpp>


int main(int argc, const char *argv[])
{

    // Initialize seed .
    std::mt19937 gena;
    boost::random::mt19937 genb;
    gena.seed( 10 );
    genb.seed( 10 );

    std::normal_distribution<> norma;
    boost::random::normal_distribution<> normb;

    std::cout << "STD BOOST" << std::endl;
    for (size_t i = 0; i < 20; i++) 
        std::cout << norma(gena) << ' ' << normb(genb) << std::endl;

    return 0;
}

我在arch-linux上用gcc-8.1进行了编译,得到了以下内容:

STD BOOST -0.0512656 1.16196 -1.90693 -0.742973 1.23919 -1.10165 -0.212754 1.03149 -0.376303 0.597194 0.0660327 -0.12573 -1.01706 1.10728 0.907624 -0.370934 -0.682124 -0.404068 -0.461218 -0.46376 0.965666 -0.607265 0.560664 -1.44186 0.749932 0.449968 -0.31456 -0.268649 0.366249 0.986499 0.608089 -0.500526 -1.08684 -0.0215645 0.120559 -0.805144 1.40203 0.390409 -0.434259 0.0991071

我在Mac机(Apple LLVM version 7.0.2 (clang-700.1.81)上使用了相同的代码);我得到以下信息:

STD BOOST -1.90693 1.16196 -0.0512656 -0.742973 -0.212754 -1.10165 1.23919 1.03149 0.0660327 0.597194 -0.376303 -0.12573 0.907624 1.10728 -1.01706 -0.370934 -0.461218 -0.404068 -0.682124 -0.46376 0.560664 -0.607265 0.965666 -1.44186 -0.31456 0.449968 0.749932 -0.268649 0.608089 0.986499 0.366249 -0.500526 0.120559 -0.0215645 -1.08684 -0.805144 -0.434259 0.390409 1.40203 0.0991071

请注意,使用std::random的第一列是不同的;但是如果仔细观察,第一列有许多共同的元素,但似乎被改组了。

我担心在我们更换旧的正态分布生成器以支持std::random之后,在Travis上进行的一项测试失败之后(这意味着Ububtu-14.04和xcode-9.2将显示相同的结果)。

是错误吗?还是我做错了什么? BOOST正常。

1 个答案:

答案 0 :(得分:3)

当您使用不同的编译器(甚至编译器的版本)时,正态分布中的伪随机数不必仅仅因为您使用了相同的种子而相同。除非我使用相同的编译器,编译器版本以及可能的优化设置,否则我不会依赖相同的顺序,如果需要的话,请查看编译器实现文档。

毫不奇怪,boost更加一致,因为尽管编译器有所不同,但您大概仍在使用相同的实现。