一道Matlab题目,关于蒙特卡罗函数的,诚寻高手

2024-05-16

1. 一道Matlab题目,关于蒙特卡罗函数的,诚寻高手

需要蒙特卡洛方法?
高中的排列组合就可以了
在matlab函数里有一个nchoosek(n,k)就是在n中选择k个的可能性
16个选8的可能性有nchoosek(16,8)=12870种
A的可能性有nchoosek(8,8)*nchoosek(8,0)*2=2种可能,概率2/12870=0.0155%
B的可能性有nchoosek(8,7)*nchoosek(8,1)*2=128种可能,概率128/12870=0.99%
C的可能性有nchoosek(8,6)*nchoosek(8,2)*2=1568种可能,概率1568/12870=12.18%
D的可能性有nchoosek(8,5)*nchoosek(8,3)*2=6272种可能,概率6272/12870=48.73%
E的可能性有nchoosek(8,4)*nchoosek(8,4)=4900种可能,概率4900/12870=38.07%

这类游戏期望值为10*0.0155%+1*0.99%+0.5*12.18%+0.2*48.73%-3*38.07%=-0.9723
也就是说你如果你玩足够多次的话,平均每次回输0.9723元

一道Matlab题目,关于蒙特卡罗函数的,诚寻高手

2. Matlab关于蒙特卡方法的仿真

编了一个简单的程序,供参考。
 
按照题意,应该就是在圆内生成随机点,然后看该点落在矩形区域内的概率。
感觉设置N和R两个参数其实没必要,直接进行N*R次模拟应该就可以了。
生成随机数的方式存在一定的问题。题中并没有指定随机数的分布规律,这里按照和圆心距离均匀分布、角度也均匀分布处理。这样似乎和射门没什么关系了,因为射门不太可能是这样的规律。另外,尽管沿径向和角度都是均匀分布的,并不意味着在整个圆内分布是均匀的(靠近圆心的位置更密集)。
 
参考代码:
% 参数输入d = inputdlg({'随机进球数N' '试验次数R'},'试验设置',1,{'1000' '100'});if isempty(d), return, endN = round(str2double(d{1}));R = round(str2double(d{2}));L = 4;W = 2;D = sqrt(L^2+W^2); % 绘图clft = linspace(0,2*pi,200);plot(D/2*cos(t),D/2*sin(t),'linewidth',2);hold onpatch([-1 1 1 -1]*L/2,[-1 -1 1 1]*W/2,'c','Facealpha',0.3)h = plot(NaN,NaN,'.');axis equal % 模拟P = zeros(R,1);for n = 1 : R    r = rand(N,1)*D/2;    t = rand(N,1)*2*pi;    x = r.*cos(t);    y = r.*sin(t);    P(n) = sum( abs(x) <= L/2 & abs(y) <= W/2 ) / N;    set(h,'xdata',x,'ydata',y);    drawnowend % 计算概率p = mean(P)
最新文章
热门文章
推荐阅读