目录
- 实验目的
- 实验原理
- 实验步骤
- 实验结果及分析
- “运气王”游戏模拟
- 程序代码
一、实验目的
1.学习并掌握matlab模拟随机过程的方法。
2.验证切比雪夫大数定律。
3.探索微信红包抽取顺序与抽取金额的关系。
4.探索微信红包“运气王”游戏获得最大利益的方案。
二、实验原理
1. 离散均匀分布
离散均匀分布是统计学中的一种离散型分布族。常记为{DiscreteU(a,b):a<b};
设n=[b-ah],随机变量X的取值为X=a+ih,i=0,1,2,…,n-1;概率分布函数为P(X=a+ih)=1/n, i=0,1,2,…,n-1.那么称此随机变量服从参数为a,b,h的离散均匀分布。
2.微信红包抽取金额的分布Yi
设有n个人,Xi,i=1,2,..,n,依次抽取微信红包,红包总额为H元,记Xi抢到的金额为Yi元。每次抽红包的金额服从0.01到剩余金额的均值的两倍的左闭右开区间上的离散均匀分布,且最后一人获得剩余所有金额,即
PYi=0.01k=n-i+1200(H-j=1i-1Yj)-n+i-1,200(H-j=1i-1Yj)n-i+1为整数1200(H-j=1i-1Yj)n-i+1,200(H-j=1i-1Yj)n-i+1不为整数
i=1,2,…,n-1
k=1,2,…,N
N=200(H-j=1i-1Yj)n-i+1-1,200(H-j=1i-1Yj)n-i+1为整数200(H-j=1i-1Yj)n-i+1,200(H-j=1i-1Yj)n-i+1不为整数
且Yn=H-i=1n-1Yi.
记Y1的期望EY1,Y2的期望E(Y2),考虑10个人,依次抽取总额为100元的红包的情形,则
EY1=i=119990.01k*11999=10
3.切比雪夫大数定律
考虑每人抽到红包的金额的期望,因为DYi有限,i=1,2,…,n,所以由切比雪夫大数定律有,∀ε>0,
limn→∞PEYi-1ni=1nYii<ε=1
三、实验步骤
1.编写程序1,模拟10人抽取总额为100元的红包,模拟100000次,记录每人成为运气王的频率,重复10次。并绘制成为运气王的频率与抽取红包顺序的关系图。
2.编写程序2,模拟10人抽取总额为100元的红包,模拟100000次,记录每人抽取金额的均值与方差。并绘制每人抽取金额的均值、方差分别与抽取红包顺序的关系图。
四、实验结果及分析
1. 成为运气王的频率与抽取顺序的关系
频率分布表为:
频率分布图为:
结果分析:在10人抽取红包种,第5位成为运气王的频率最低;第5位之后,成为运气王的频率逐渐上升;第9位、10位成为运气王的频率较高,且近似相等。
2.抽取金额均值、方差分别与抽取顺序的关系
抽取金额均值与抽取顺序的关系表:
抽取金额均值与抽取顺序的关系图:
抽取金额方差与抽取顺序的关系表:
抽取金额方差与抽取顺序的关系图:
结果分析:
(1)第一位抽取红包的人所抽取的金额的均值为9.98,接近10,符合切比雪夫大数定律。
(2)取的期望金额与顺序无关,但随着抽取顺序的增加,抽取金额的方差逐渐增大。
3.抽取红包的顺序与收益的关系
(1)当抽取次数足够多时,抽取金额的期望与抽取顺序无关。
(2)当抽取次数较少时,抽取顺序越靠后,抽到最大红包的概率越大,但抽取金额的方差也越大,即抽到较小红包的概率变大,风险增大。
五、“运气王”游戏模拟
游戏1:10人进行抢红包游戏,每人抢红包的顺序不变,抢到的金额如上分布,每人有初始金额1000元,有初始红包100元,每局的手气最佳的人发100元红包进行下一局,当一局游戏结束时,若有一人的剩余金额小于100,则游戏结束。
游戏2:在游戏1的基础上,将每局发红包的人由“手气最佳的人”改为“手气最差的人”。其余保持不变。
实验步骤:编写程序3模拟游戏1,编写程序4模拟游戏2,并记录游戏结束时,平均游戏局数与平均剩余金额。若令Moneyi为每一局游戏结束时每人的剩余金额,Yij为第i局游戏中结束时,第j个人的剩余金额,则
Moneyi=[Yi1,Yi2,…,Yin]
且Moneyi为带吸收壁的随机游动过程。
模拟结果:
游戏1:运行结果:
平均游戏局数:averagek = 246.3463
平均剩余金额如下图:
结论:前7位预期收益为正,后3位预期收益为负;第4、5的预期收益最大,第9、10的预期亏损最大。
Game2:
平均游戏局数:averagek = 169.7919
平均剩余金额如下图:
结论:前7位预期收益为正,后3位的预期收益为负;且随着抽取顺序的靠后,预期收益逐渐变小。
六、程序代码
程序1:
%n个人x1,x2,...,xn,H元红包,xi抽到yi元红包,sup为每次取红包上界
%模拟m次
function lottery(n,H,m)
y=zeros(m,n);kinglucknum=zeros(1,n);
for j=1:m
sum=0;
for i=1:n-1
sup=2*(H-sum)/(n-i+1);
if floor(100*sup)==(100*sup)
y(j,i)=unidrnd(100*sup-1)/100;
else
y(j,i)=unidrnd(floor(100*sup))/100;
end
sum=sum+y(j,i);
end
y(j,n)=H-sum;
example=y(j,:);
[~,who]=max(example);
kinglucknum(who)=kinglucknum(who)+1;
end
[~,kingluck]=max(kinglucknum);
kinglucknum
kingluck
rate=kinglucknum/m;
plot(rate)
end
程序2:
%n个人x1,x2,...,xn,H元红包,xi抽到yi元红包,sup为每次取红包上界
%模拟m次
function expectation(n,H,m)
y=zeros(m,n);average=zeros(1,n);variance=zeros(1,n);
for j=1:m
sum=0;
for i=1:n-1
sup=2*(H-sum)/(n-i+1);
if floor(100*sup)==(100*sup)
y(j,i)=unidrnd(100*sup-1)/100;
else
y(j,i)=unidrnd(floor(100*sup))/100;
end
sum=sum+y(j,i);
end
y(j,n)=H-sum;
end
for i=1:n
for j=1:m
average(i)=average(i)+y(j,i);
end
average(i)=average(i)/m;
end
for i=1:n
for j=1:m
variance(i)=variance(i)+(y(j,i)-average(i))^2;
end
variance(i)=variance(i)/m;
end
N=1:n;
average,variance
figure(1)
scatter(N,average)
box off
figure(2)
scatter(N,variance)
box off
end
程序3:
function game1(n,H,m,M0)
%n:人数;H:红包金额;m:模拟次数;M0:初始金额;k局数;
%averagemoney:每人剩余金额的期望;average:游戏局数的均值
money=M0*ones(m,n);k=zeros(1,m);
for j=1:m
y=zeros(1,n);
while all(money(j,:)>=H)
k(j)=k(j)+1;sum=0;
if k(j)>1
money(j,who0)=money(j,who0)-H;
end
for i=1:n-1
sup=2*(H-sum)/(n-i+1);
if floor(100*sup)==(100*sup)
y(i)=unidrnd(100*sup-1)/100;
else
y(i)=unidrnd(floor(100*sup))/100;
end
money(j,i)=money(j,i)+y(i);
sum=sum+y(i);
end
y(n)=H-sum;money(j,n)=money(j,n)+y(n);
[~,who0]=max(y);
end
end
T=1:n;
averagemoney=mean(money,1);averagek=mean(k)
scatter(T,averagemoney)
end
程序4:
function game2(n,H,m,M0)
%n:人数;H:红包金额;m:模拟次数;M0:初始金额;k局数;
%averagemoney:每人剩余金额的期望;average:游戏局数的均值
money=M0*ones(m,n);k=zeros(1,m);
for j=1:m
y=zeros(1,n);
while all(money(j,:)>=H)
k(j)=k(j)+1;sum=0;
if k(j)>1
money(j,who0)=money(j,who0)-H;
end
for i=1:n-1
sup=2*(H-sum)/(n-i+1);
if floor(100*sup)==(100*sup)
y(i)=unidrnd(100*sup-1)/100;
else
y(i)=unidrnd(floor(100*sup))/100;
end
money(j,i)=money(j,i)+y(i);
sum=sum+y(i);
end
y(n)=H-sum;money(j,n)=money(j,n)+y(n);
[~,who0]=min(y);
end
end
T=1:n;
averagemoney=mean(money,1);averagek=mean(k)
scatter(T,averagemoney)
end