【数学】均匀分布生成其他分布的方法
来源:互联网 发布:wiley数据库使用方法 编辑:程序博客网 时间:2024/05/16 01:47
起因是前几天做A厂的在线编程题,需要用正态分布去生成一个随机数,最后调用了C++自带的正态分布生成库,这时就在想底层是如何实现正态分布的。
由均匀分布生成其他分布的通用性方法
CDF的反函数法/Inverse transform sampling
先用均匀分布生成一个数,把其映射到[0,1]之间
double U = (double)rand() / RAND_MAX;
这样的一个[0,1]分布,怎么将其转换成一个其他分布呢?
这时就用到了概率分布的累积分布函数(CDF- Cumulative distribution function)
找到纵坐标[0,1]对应的横坐标点,就生成了一个满足该概率分布的点。
所以将这个方法形式化一下:
- 用均匀分布生成[0,1]之间的均匀分布产生的数
x - 找到CDF函数
F(x) 的反函数F−1(x) 带入反函数中得到的数就是满足该概率分布生成的一个数。
这种方法有一个问题就是,需要算出反函数的解析解,如果没有解析解的话,就不能直接用这种方法了【比如正态分布】
其实仔细一想轮盘赌算法不就是应用的CDF反函数法吗?
Acceptance-Rejection Method/rejection sampling
这个就是应用蒙特卡洛解决一切的思路来了,每次在这个下面这个概率密度坐标里随机生成一个点【随机采样】如果这个点落在了概率密度函数(PDF-probability density function)之下,则采样成功,如果落在了上面则继续采样。
这种方法等于是模拟概率密度函数:它每次生成新的随机数后,通过另一个随机数来保证其被接受概率服从指定的PDF。
正态分布的特定方法
中心极限定理法
中心极限定理:
当
一定要注意分母是
因为随机变量和的方差
即
用这种方法生成尽可能多的均匀分布,然后求和归一化之后就是标准正态分布生成的
Box-Muller
这个其实方法本质上也是用CDF的反函数,只不过在
这个地方用到的数学知识太多,接下来再补一篇单独列点其中的数学知识。
ziggurat方法
因为Box-Muller方法需要进行log和cos的运算,所以效率不是太高。而rejection sampling又会造成不少的浪费,所以就有了采样拒绝率不那么高的方法。
这个方法是《Numerical Computing with MATLAB》提到的方法
这个方法详见[4]中所说
参考资料
- 如何产生正态分布的随机数?
- 生成特定分布随机数的方法
- 均匀分布生成标准正态分布 python
- 漫谈正态分布的生成
- 【数学】均匀分布生成其他分布的方法
- 【MATLAB】高斯分布 均匀分布 以及其他分布 的随机数生成函数
- 用C语言实现均匀分布,瑞利分布,莱斯分布,高斯分布的分布函数
- 概率论中几种常见的分布形式(二项分布,均匀分布和指数分布)
- 使用均匀分布随机数产生器构造任意分布的随机数产生器
- C++实现生成均匀分布的数字
- 均匀分布随机数的生成算法简介
- 生成特定分布随机数的方法
- 生成特定分布随机数的方法
- 生成特定分布随机数的方法
- 均匀分布和高斯分布
- python随机数分布random均匀分布
- 常见的三大分布:均匀分布、正态分布、泊松分布、指数分布
- 验证scala.math.random生成的随机数是均匀分布的
- 利用curand的host API生成均匀分布的随机数
- 【算法分析】随机数的生成:均匀分布、正态、泊松 、瑞利
- 均匀分布的概率密度函数和分布函数学习笔记1
- 不均匀分布随机数产生均匀分布随机数
- What is a Proxy?
- codeforces 781A Round #403 Div. 2C
- [面试][架构] 微服务、SOA、ESB
- 判断一个数字是否在升序矩阵中
- Android中文件的压缩和解压缩
- 【数学】均匀分布生成其他分布的方法
- Python爬虫利器一之Requests库的用法
- 可重入函数设计
- 371. Sum of Two Integers
- hdu-1575(Tr A)
- Python字典的常用方法总结
- C++基础6:虚函数、纯虚函数
- jQuery Mobile 快速入门
- Java多线程-实例解析