【问题标题】:Boost vs. .Net random number generatorsBoost 与 .Net 随机数生成器
【发布时间】:2013-04-25 15:14:39
【问题描述】:

我在 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) 有趣的问题。几个问题 - 1.C++ 实现不收敛是什么意思? 2.你为你的实验抽取了多少个样本?

标签: c++ boost random f#


【解决方案1】:

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

来自the documentation on Random

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

.

我是否应该使用这两种生成随机数的方式获得不同的结果?

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

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

【讨论】:

  • 你知道它在Boost中是否可用(理想情况下具有相同的参数)?
  • @Grzenio 很难说。但似乎你可以实现mt algorithm in .NET
  • @Grzenio : boost::random::knuth_b 使用与 System.Random 相同的算法,但在 .NET 中分发的工作方式不同,因此即使使用相同的种子,您也不会得到相同的输出。
猜你喜欢
  • 2011-01-16
  • 1970-01-01
  • 1970-01-01
  • 2011-05-18
  • 2023-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-12
相关资源
最近更新 更多