Boost vs. .Net随机数生成器

时间:2013-04-25 15:14:39

标签: c++ boost random f#

我在F#(。Net)和C ++中开发了相同的算法(Baum-Welch用于估计隐马尔可夫模型的参数)。在这两种情况下,我开发了相同的测试,生成具有已知分布的随机测试数据,然后使用该算法估计参数,并确保它收敛到已知的正确答案。

问题是测试在F#情况下运行良好,但未能在C ++实现中收敛。我在一些真实数据上比较了两种算法并且它们给出了相同的结果,所以我的猜测是在C ++的情况下打破了测试数据的生成。因此我的问题是:.Net 4附带的随机数生成器是什么(我认为这是VS2010的默认版本)?

在F#我正在使用:

let random = new Random()
let randomNormal () = //for a standard normal random variable
    let u1 = random.NextDouble()
    let u2 = random.NextDouble()
    let r = sqrt (-2. * (log u1))
    let theta = 2. * System.Math.PI * u2
    r * (sin theta)
//random.NextDouble() for uniform random variable on [0-1]

在C ++中,我使用标准的Boost类:

class HmmGenerator
{
public:
    HmmGenerator() :
         rng(37), //the seed does change the result, but it doesn't  make it work
         normalGenerator(rng, boost::normal_distribution<>(0.0, 1.0)),
         uniformGenerator(rng, boost::uniform_01<>()) {}//other stuff here as well
private:
    boost::mt19937 rng;
    boost::variate_generator<boost::mt19937&, 
                           boost::normal_distribution<> > normalGenerator;
    boost::variate_generator<boost::mt19937&, 
                           boost::uniform_01<> > uniformGenerator;
};

使用这两种生成随机数的方法,我应该期待不同的结果吗?

编辑:此外,.Net中使用的生成器是否可用于Boost(理想情况下具有相同的参数),因此我可以在C ++中运行它并比较结果?

1 个答案:

答案 0 :(得分:4)

  

因此我的问题是:.Net 4附带的随机数生成器是什么(我认为这是VS2010的默认版本)?

来自the documentation on Random

  

Random类的当前实现基于Donald E. Knuth的减法随机数生成器算法。有关更多信息,请参阅D. E. Knuth。 “计算机编程的艺术,第2卷:半数值算法”。 Addison-Wesley,Reading,MA,第二版,1981年。

  

使用这两种生成随机数的方法,我应该期待不同的结果吗?

与其他现成的随机生成器相比,您在C ++中使用的Mersenne-Twister算法被认为是非常值得尊敬的。

我怀疑您的代码中的任何差异都在其他地方。