问题
有r个人在一楼进入电梯楼上共有n层设每个乘客在任何层楼出电梯的概率相同.试建立一个概率模型,求直到电梯中的人下完为止,电梯需停次数的数学期望并对r=10,n=7进行模拟验证
直接R模拟(大数定律)
注意括号各种英文输入,R语言编写时候看不出明显区别
elevator <- function(r,n,m){ #r个人,n为1楼以上楼层数,m为数据个数
y=0
for(i in 1:m){
u<-runif(r) #默认考虑不出现0和1
x<-floor(u*n)+1
y[i]<-length(unique(x))
}
rt=mean(y);
rt
}
其中函数说明
runif
生成均匀分布的随机函数
句法是:runif(n,min,max) n表示生成的随机数数量,min表示均匀分布的下限,max表示均匀分布的上限;若省略参数min、max,则默认生成[0,1]上的均匀分布随机数。
例
> runif(5) # 生成5个[0,1]的均匀分布的随机数
[1] 0.329008006 0.789094851 0.783691668 0.660506713 0.001850444
> runif(5,0,5) # 生成5个[0,5]的均匀分布的随机数
[1] 1.7970188 3.8995100 1.0519334 2.5112307 0.2245155
tip:同样还有以二项、正态、指数等生成随机数的函数详见
floor
句法是:floor(x) 其功能是“向下取整”
> a<-c(0.12, 1.3332, 3.623, 4.999, 8.981)#c表示向量
> floor(a)
[1] 0 1 3 4 8
tip:同样还有向上取整,四舍五入详见
代码中runif和floor配合使用表示生成从1~n的r个随机数(放在x中)
u<-runif(r) #默认考虑不出现0和1
x<-floor(u*n)+1
单独用如下
> a<-runif(5)
> floor(a*10)+1
[1] 7 5 6 5 7 #1~10 5个随机数
> a<-runif(5)
> floor(a*10)+1
[1] 4 2 2 3 1 #1~10 5个随机数
unique
unque用法很多,基本都是围绕去重详见
> unique(c(1,1,5,3,5,2,2,1))
[1] 1 5 3 2
length
数组长度,即行数和列数中的较大值,相当于max(size(a))
> length(c(1,3,4,2,5))
[1] 5
tip:相似还有求数组行列数和元素总数详见
mean
表示求数组得平均值详见
> mean(c(0,1,2,3,4,5))
[1] 2.5
结果
> elevator <- function(r,n,m){ #r个人,n为1楼以上楼层数,m为数据个数
+ y=0
+ for(i in 1:m){
+ u<-runif(r)
+ x<-floor(u*n)+1
+ y[i]<-length(unique(x))
+ }
+ rt=mean(y);
+ rt
+ }
> elevator(7,10,5000)
[1] 5.2412