课本:统计模拟及其R实现 - 肖枝红,朱强 武汉大学出版社
参考课件:第三章 随机数 - 浙江大学数学科学学院
目录
1. 逆变换法
2. 筛选法
3. 合成法
题目1:用逆变换方法生成如下密度函数的随机变量,要求写出R程序:Cauchy概率密度函数
解:
记
则有
故可以通过生成随机变量U后,令 即可得到随机变量X的模拟值.
代码:
t1 = function(n) {
U = runif(N)
X = tan(pi*(U-0.5))
X
}
t1(10) # 生成10个随机变量X
题目2:用逆变换方法生成如下概率函数的随机变量,要求写出R程序:
解:
令
故可以通过生成随机变量U后,令 即可得到随机变量X的模拟值.
代码:
t2 = function(n) {
U = runif(n)
X = floor((1+U)/(1-U))
X
}
t2(10)
题目1:用筛选法来模拟如下密度函数的随机变量,f(x)是需要模拟的随机变量密度函数,g(x)是其对应的筛选函数:
解:
算法步骤如下:
① 生成密度函数为g的随机变量Y
② 生成随机数U
代码:
t3 = function(n) {
x = 1; x[2] = 1
for (i in 1:n) {
repeat {
u1 = runif(1)
y = sqrt(-2*log(u1))
u2 = runif(1)
if (u2 <= 1/(1+y^2)) {
x[i] = y
break
}
}
}
x
}
t3(10)
题目2:令X是一个均值为1 的指数随机变量,给出一个有效算法来模拟一个随机变量,其分布函数为给定的X<0.05条件下的X的条件分布,也就是它的密度函数为:
解:
选择筛选法进行随机变量模拟,选择 ,则有
代码:
t4 = function(n) {
x = 1; x[2] = 1
for (i in 1:n) {
repeat {
u1 = runif(1)
y = -log(u1)
u2 = runif(1)
if (u2 <= 1/(1-exp(-0.05)) & y>0 & y<0.05) {
x[i] = y
break
}
}
}
x
}
t4(10)
题目:假设随机变量X分别依照概率 0.06, 0.06, 0.06, 0.06, 0.06, 0.15, 0.13, 0.14, 0.15, 0.13 取值 1, 2, ..., 10. 用合成法产生X值
解:
题目中给出的分布律为:
X | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
P | 0.06 | 0.06 | 0.06 | 0.06 | 0.06 | 0.15 | 0.13 | 0.14 | 0.15 | 0.13 |
观察可得,相同概率的数字有:
1 2 3 4 5 - 概率为0.06,分布律记为X1
6 9 - 概率为0.15,分布律记为X2
7 10 - 概率为0.13,分布律记为X3
8 - 0.14
创建X1的分布律:
X | 1 | 2 | 3 | 4 | 5 |
P | 0.2 | 0.2 | 0.2 | 0.2 | 0.2 |
创建X2的分布律:
X | 6 | 9 |
P | 0.5 | 0.5 |
创建X3的分布律:
X | 7 | 10 |
P | 0.5 | 0.5 |
算法思路:
① 产生两个均匀分布的随机数u1 u2
② 当 u1 <= 0.3,令 X = 1*floor(5*u2) + 1
(1*floor意思是1 2 3 4 5 6的间隔为1,5*u2意思是0.2*5=1,+1的意思是起始值为1,后面以此类推)
③ 当 u1 <= 0.6,令 X = 3*floor(2*u2) + 6
④ 当 u1 <= 0.86,令 X = 3*floor(2*u2) + 7
⑤ 当 u1 为其他值时,令 X = 8
代码:
t5 = function(n) {
x = 0; x[2] = 0
for (i in 1:n) {
u1 = runif(1); u2 = runif(2)
if (u1 <= 0.3) {
x[i] = floor(5*u2)+1
} else if (u1 <= 0.6) {
x[i] = 3*floor(2*u2)+6
} else if (u1 <= 0.86) {
x[i] = 3*floor(2*u2)+7
} else {
x[i] = 14
}
}
x
}
t5(10)
本人为零基础小白,努力学习中,发布的文章难免有错误及纰漏之处,欢迎各位看官批评指正!