验收拒绝算法c ++正态分布

时间:2014-02-10 12:03:42

标签: c++ numerical-methods

一般的接受拒绝算法与往常一样。

1从Unif [0,1]

生成U 1,U 2,U 3

2 X←-log(U 1)

3如果U 2> exp(-0.5(X - 1)2)....回到条件满足。

我的问题是,我是否需要为每个均匀分布使用单独的种子或使用相同的种子?

3 个答案:

答案 0 :(得分:0)

您需要使用相同的种子 - 例如,您必须只为种子生成一次。更重要的是,你应该只使用一个生成器:没有理由使用多个生成器,并且很容易引入多个错误。

从技术上讲,对于一个足够好的PRNG来说,无关紧要(只要种子是不同的),但它也不会受到伤害。对于较差的PRNG,如果种子以任何方式相关,使用单独的种子可能会显着扭曲您的结果(除非您从真正的随机设备中种子,否则它们实际上通常都是如此)。

请务必在C ++中使用新的<random>标准标头! std::rand应被视为已弃用。

答案 1 :(得分:0)

我认为问题在于,用于在接受拒绝算法中生成辅助变量的伪随机数生成器(PRNG)是否应该以不同方式播种。

如果没有良好的PRNG,你不可能拥有良好的统计特性,因此在考虑播种之前,选择一个好的发电机。给定一个好的生成器,在创建两个独立分发的用例中不需要使用不同的种子。事实上,你可能会意外地(即使不太可能有一个好的发电机)选择一个特别糟糕的种子组合,导致统计异常。

幸运的是,从C ++ 11开始,通常在标题<random>中提供了良好的PRNG。我的默认选择是Mersenne Twister。我认为你希望通过手动编码的接受拒绝作为实践或由于某些其他要求来生成正态分布。如果没有,C ++ 11已经为您提供了可以使用的normal distribution

答案 2 :(得分:-1)

你必须使用不同的种子,因为如果你使用相同的种子,那么随机变量的协方差为1.