一、分布函数及随机数在R中的基本操作及应用
1.用R语言的条件语句写出计算分布函数F(x)的值的程序代码。
#第一题(方法一)
fun=function(x,y=x){
if(x<0){x-y}
else if(x>=0&x<1){x}
else {x-y+1}
}
fun(5) #括号内输入函数x的值,可计算出f(x)
运行结果如下:
方法二:
R代码为:
#第一题(方法二)
f=function(x){
if(x>1){
return(1)
}
else if(x<0){
return(0)
}
else{
return(x)
}
}
f(x<-readline("请输入数据:"))
f(x<-readline("请输入数据:"))
f(x<-readline("请输入数据:"))
f(x<-readline("请输入数据:"))
运行结果如下:
2.在摇奖机中放入10个完全相同的球,分别标有数字1~10,每次启动摇奖机可以摇出一个球,
(1)将上述过程重复100次,用R模拟这个过程,将所有结果保存在名为result的向量中。
(2)对于i=1,2,...,10以及i=20,50,80,100,分别模拟10i次摇奖结果,计算数字3,6,9出现的频率。
解:
(1)R代码如下:
#第二题
#第一问
x<-sample(1:10,100,replace=T,prob=NULL)#获取随机数
result<-data.frame(x)#讲数据储存在result中
运行结果如下:
(2)运行代码如下:
#第二问
#i=1,2,...,10模拟10i次摇奖结果
for (i in 1:10){
result1<-sample(1:10,10*i,replace=T)
cat('3,6,9出现的频率依次为:','\n')
p<-c(sum(result1==3)/length(result1),
sum(result1==6)/length(result1),
sum(result1==9)/length(result1))
print(p)}
#i=20,50,80,100模拟10i次摇奖结果
x<-c(20,50,80,100)
for (i in x){
result2<-sample(1:10,10*i,replace=T)
cat('3,6,9出现的频率依次为:','\n')
p<-c(sum(result2==3)/length(result2),
sum(result2==6)/length(result2),
sum(result2==9)/length(result2))
print(p)}
运行结果如下:
二、离散型随机数的产生及应用R语言表述
1.甲乙两人下棋,每局中甲赢的概率为0.6,输的概率为0.2,平局的概率为0.2,则两人下8场棋,甲可能的胜负情况为?
解:
R代码如下:
result1<-sample(c("赢","平手","输"),8,replace=T, prob=c(0.6,0.2,0.2))
cat('赢,平手,输出现的频率如下:',result1)
p<-c(sum(result1=="赢")/length(result1),
sum(result1=="平手")/length(result1),
sum(result1=="输")/length(result1))
print(p)
运行结果如下:
2.设有一决策系统,其中每个成员做出的决策互不影响,且每个成员作出正确决策的概率均为0.8。现由5个成员的决策系统,设作出正确决策的人数为X,试求出X的分布列及分布函数;若当占半数以上的成员作正确决策时,系统才能作出正确决策,求系统作出正确决策的概率。(要求作图:X的分布列,分布函数图,图上有标题,x轴,y轴的描述)
解:
R代码如下:
p_correct <- 0.8 #每个成员作出正确决策的概率为0.8
x <- 0:5 #5个成员作出决策共有6种可能,作出正确决策的人数0到5
dist_x <- dbinom(x, size = 5, prob = p_correct) #计算X的分布列
dist_x
cdf_x <- pbinom(x, size = 5, prob = p_correct) #计算X的分布函数
cdf_x
p_success <- sum(dist_x[(5/2+1):6])
cat("系统作出正确决策的概率为:",p_success)
library(ggplot2)
df <- data.frame(X = x, P = dist_x, CDF = cdf_x)
# X的分布列
ggplot(df, aes(x = X, y = P)) +
geom_col(fill = "darkseagreen") +
labs(title = "X的分布列",
x = "作出正确决策的人数",
y = "作出正确决策的概率")
# X的分布函数图
ggplot(df, aes(x = X, y = CDF)) +
geom_step() +
labs(title = "X的分布函数图",
x = "作出正确决策的人数",
y = "作出正确决策的概率")
运行结果如下:
3.由该商店过去的销售记录知道,某种商品每月的销售数可以用参数=10的泊松分布来描述,为了以95%以上的把握保证不脱销,问商店在月底至少应进某种商品多少件?(本例可进行验证,并作图:X的分布列,分布函数图,图上有标题,x轴,y轴的描述)
解:
R代码如下:
library(ggplot2)
lambda <- 10
prob <- 1 - ppois(0, lambda) #计算不脱销的概率
cat("不脱销的概率为:", round(prob, 4), "\n") #输出概率结果
min_sales <- qpois(0.95, lambda) #计算不脱销的最小销售数
cat("商店在月底至少应进", min_sales, "件商品\n") #输出最小销售数结果
x <- 0:20 # 假设最大销售数为20件
prob_x <- dpois(x, lambda)
# 绘制X的分布列图
ggplot() +
geom_bar(aes(x = x, y = prob_x), stat = "identity", fill = "deeppink") +
labs(title = "商品销售数分布列",
x = "销售数", y = "不脱销的概率") +
theme_minimal()
运行结果如下:
三、逆变换抽样法、舍选抽样法及合成法用R语言表述
1.试用变换抽样法、及舍选抽样法Ⅰ产生密度为p(x)= 8/9�2 ,x∈(0,1)的随机数,循环500次,要求给出两种算法的r程序。
解:
R代码如下:
#1.舍选抽样法
z<-integer(500) #生成500个随机数
i=1
while(i<=500){
U1<-runif(1,0,1) #生成[0,1]之间的均匀分布随机数
U2<-runif(1,0,1)
X<-0+(1-0)*U1 #进行舍选抽样的候选随机数
Y<-8/9*U2
p<-8/9*(X**2) #密度函数p(x)
if(Y<=p){ #如果Y在[0,p(x)]之间,则接受该随机数
z[i]=X;
i=i+1}
}
z
#变换抽样法
z<-integer(500) #生成500个随机数
for(i in 1:500){ #生成[0,1]之间的均匀分布随机数
U<-runif(1,0,1) #生成[0,1]之间的均匀分布随机数
X<-sqrt(9/8*U) #通过逆变换法得到符合p(x)的随机数
z[i]<-X
}
z
代码运行结果:
2.试用合成法产生密度函数为p(x)=(1+2x)/6,0<x<2的随机数。
R代码:
#第二题
z<-integer(500) #生成500个随机数
for(i in 1:500){
U1<-runif(1,0,1) #将p(x)拆分为两个密度函数的线性组合,即p(x)=1/6+2x/6
if(U1<1/6){
X<-runif(1,0,1)
}
else{
U2<-runif(1,0,1)
X<-sqrt(6*U2)
z[i] = X
}
}
z
代码运行结果: