我在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 ++中运行它并比较结果?答案 0 :(得分:4)
因此我的问题是:.Net 4附带的随机数生成器是什么(我认为这是VS2010的默认版本)?
Random类的当前实现基于Donald E. Knuth的减法随机数生成器算法。有关更多信息,请参阅D. E. Knuth。 “计算机编程的艺术,第2卷:半数值算法”。 Addison-Wesley,Reading,MA,第二版,1981年。
使用这两种生成随机数的方法,我应该期待不同的结果吗?
与其他现成的随机生成器相比,您在C ++中使用的Mersenne-Twister算法被认为是非常值得尊敬的。
我怀疑您的代码中的任何差异都在其他地方。