接受拒绝算法 C++ 正态分布

acceptance rejection algorithm c++ normal distribution

本文关键字:C++ 正态分布 算法 拒绝      更新时间:2023-10-16

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

1

从 Unif[0,1] 生成 U 1 ,U 2 ,U 3

2 X ← −log(U 1 )

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

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

您需要使用相同的种子 – 就像 in 一样,您只能为生成器设定一次种子。更重要的是,您应该只使用一个生成器:没有理由使用多个生成器,并且很容易引入多个生成器的细微错误。

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

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

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

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

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

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