有没有办法在不计算 CDF 的情况下从非标准分布生成随机变量
Is there a way to generate a random variate from a non-standard distribution without computing CDF?
我正在尝试编写蒙特卡罗模拟。在我的模拟中,我需要从离散概率分布生成许多随机变量。
我确实有一个用于分布的封闭式解决方案,并且它具有有限的支持;但是,它不是标准分布。我知道我可以绘制一个均匀[0,1)随机变量并将其与CDF进行比较,从我的分布中获得随机变量,但是分布中的参数总是在变化。使用此方法太慢。
所以我想我的问题分为两部分:
-
是否有一种方法/算法可以在不使用 CDF 的情况下快速生成有限的离散随机变量?
-
是否有已经具有此功能的 Python 模块和/或C++库?
接受\拒绝:找到一个始终高于 pdf 的函数。生成 2 个随机变量。第一个用于缩放以计算值,第二个用于决定是接受还是拒绝选择。冲洗并重复,直到接受一个值。对不起,我不能更具体,但我有一段时间没有这样做了。这是一个标准算法,但我个人会从头开始实现它,所以我不知道有任何实现。
如果你分析地了解你的pdf,接受/拒绝是要走的路。我们称之为f(x)。找到一个pdf g(x),使得存在一个常量c,使得c.g(x)>f(x),并且你知道如何用pdf g(x)模拟变量 - 例如,当你使用有限支持的分布时,一个均匀的将做:g(x)= 1/(你的域的大小)在域上。
然后画一对 (G, U),使得 G 用 pdf g(x) 模拟,U 在 [0, c.g(G)] 上是均匀的。然后,如果 U
请注意,常数 c 决定了方法的效率。c越小,效率越高 - 基本上平均需要c图纸才能获得正确的变量。最好得到一个足够简单的函数 g(不要忘记你需要使用 g 作为 pdf 绘制变量),但会尽可能小的 c。
如果接受拒绝也太低效,你也可以尝试一些马尔可夫链 MC 方法,它们生成一个样本序列,每个样本都依赖于前一个样本,因此通过跳过它们的块,可以子样本获得或多或少的独立集合。他们只需要PDF,甚至只需要它的倍数。通常它们使用固定分布,但也可以适应缓慢变化的分布。
- C4204:使用的非标准扩展:非常量聚合初始值设定项
- 在双重继承的情况下如何处理非标准构造函数
- CMake 不编译具有非标准扩展名的文件
- 定义具有非标准签名的自定义映射比较器
- 我想获取点的属性,它报告错误 C3867:"point::output_x":非标准语法;使用"&"创建指向成员的指针
- 非标准语法,使用 & 创建指向成员的指针
- 在Qt中链接具有非标准名称的lib文件
- 非标准语法使用 '&' 创建指向成员 C++ 的指针
- WINAPI EnumWindowsProc:非标准语法;使用 & 创建指向成员的点
- Vulkan-hpp 是reinterpret_casting非标准布局类到另一个类.这合法吗?
- 'cv::Mat::type':非标准语法;使用 '&' 创建指向成员的指针
- registerPointPickingCallback (PCLViewer::callback_Test,(void*)&viewer);返回 C3687 非标准语法;使用"&"创建指向成员的指针
- 错误 C4839:非标准地使用类 'ATL::CW2AEX<520>' 作为可变参数函数的参数
- C++ Visual Studio 2015:非标准语法;使用 '&' 创建指向成员的指针
- 非标准语法;使用 & 创建指向成员的指针
- Visual Studio 2015"非标准语法;使用"&"为成员创建指针"
- 如何将 Boost 库与 CMake 链接(如果 boost 位于非标准位置,则在集群上)?
- Cmake在非标准路径中找到OpenSSL库
- 非标准语法;使用 '&' 创建指向成员的指针错误,将成员函数分配给向量时出错
- 有没有办法在不计算 CDF 的情况下从非标准分布生成随机变量