码迷,mamicode.com
首页 > 其他好文 > 详细

拉普拉斯分布的随机数

时间:2019-10-07 19:51:20      阅读:406      评论:0      收藏:0      [点我收藏+]

标签:一个   blog   matrix   begin   使用说明   c语言实现   简单   简单的   实现   

一、功能

产生拉普拉斯分布的随机数。

二、方法简介

1、产生随机变量的组合法

将分布函数\(F(x)\)分解为若干个较为简单的子分布函数的线性组合
\[ F(x)=\sum_{i=1}^{K}p_{i}F_{i}(x) \]
其中 $ p_{i}> 0 ?(\forall i) $ ,且 $ \sum_{i=1}^{K}p_{i}=1 $ ,\(F(x)\)是分布函数。

定理 若随机变量\(\xi \sim s\)离散分布\(\left \{ p_{i} \right \}\),即\(P(\xi =i)=p_{i}\),并且\(z \sim F_{\xi }(x)\),取\(z=x\),则\(z \sim F(x) = \sum_{i=1}^{K}p_{i}F_{i}(x)\)

证明 \(z\)的分布函数为
\[ P(z \leqslant t) = P((z \leqslant t) \cap \bigcup_{i=1}^{K}( \xi = i)) \= \sum_{i=1}^{K}P(z \leqslant t, \xi =i) \= \sum_{i=1}^{K}P(\xi = i)P(z \leqslant t \mid \xi =i) \= \sum_{i=1}^{K}p_{i}F_{i}(t)=F(t) \]

定理证毕。

根据此定理,我们给出产生随机数的组合算法如下:

  1. 产生一个正随机数\(\xi\),使得\(P(\xi = i) = p_{i} \ (i = 1,2,...,K)\)
  2. \(\xi = i\)时,产生具有分布函数\(F_{i}(x)\)的随机变量\(x\)

该算法中首先以概率\(p_{i}\)选择子分布函数\(F_{i}(x)\),然后取\(F_{i}(x)\)的随机数作为\(F(x)\)的随机数。

2、产生拉普拉斯分布随机数的方法

拉普拉斯分布的概率密度函数为
\[ f(x) = \frac{1}{2\beta }e^{-\frac{\left | x \right |}{\beta }} \]
Laplace分布的均值为0,方差为\(2\beta ^{2}\)。拉普拉斯分布也称为双指数分布。

根据上述的组合算法,产生拉普拉斯分布随机数的方法为:

  1. 产生均匀分布的随机数\(u_{1}\)\(u_{2}\),即\(u_{1},u_{2} \sim U(0,1)\)
  2. 计算\(x = \left\{\begin{matrix} -\beta \ ln(1 - u_{1}) & u_{1} \leqslant 0.5 \\ \beta \ ln(u_{2}) & u_{2} > 0.5 \end{matrix}\right.\)

三、使用说明

使用C语言实现产生拉普拉斯分布随机数的方法:

#include "math.h"
#include "uniform.c"

double laplace(double beta, long int *s)
{
    u1 = uniform(0.0, 1.0, s);
    u2 = uniform(0.0, 1.0, s);
    if(u1 <= 0.5)
        x = -beta * log(1.0 - u2);
    else
        x = beta * log(u2);
    return(x);
}

uniform.c文件参见均匀分布的随机数

拉普拉斯分布的随机数

标签:一个   blog   matrix   begin   使用说明   c语言实现   简单   简单的   实现   

原文地址:https://www.cnblogs.com/liam-ji/p/11631363.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!