clc,clear,close all

a=1; %平行线间距
l=a/2; %针长
x=repmat([-0.5;8.5],1,9);
y=repmat(linspace(0,8,9),2,1);
line(x,y)
hold on %固定图像框
n=1e3; %投针次数
countNeedle=0; %记录针与线相交次数,初始值为0

% 预分配内存,加快程序运行速度
needleXL=zeros(1,n);
needleYL=zeros(1,n);
theta=zeros(1,n);
needleXR=zeros(1,n);
needleYR=zeros(1,n);
my_pi=zeros(1,n);

for i=1:n
    needleXL(i)=8*rand; %随机生成投针的起始点横坐标
    needleYL(i)=8*rand; %随机生成投针的起始点纵坐标
    theta(i)=pi*rand; %随机生成针与线的夹角
    needleXR(i)=needleXL(i)+l*cos(theta(i)); %计算投针的另一端点横坐标
    needleYR(i)=needleYL(i)+l*sin(theta(i)); %计算投针的另一端点纵坐标
    plot([needleXL(i),needleXR(i)],[needleYL(i),needleYR(i)],'b') %画出投针的位置
    if fix(needleYL(i))~=fix(needleYR(i)) %判断针与线是否相交 
        countNeedle=countNeedle+1; %记录针与线相交次数
    end
    my_pi(i)=i/countNeedle;
end
piEst=n/countNeedle; %计算pi的近似值
disp(['共投针',num2str(n),'次, ','其中与平行线相交',num2str(countNeedle),'次, ','Pi的估计值为',num2str(piEst),'.'])
figure
plot(my_pi)
line([0,n],[pi,pi],'LineWidth',2,'LineStyle','--','color','r')

在这里插入图片描述


2021年3月10日17:21:42


2022年3月22日14:00:07 有少许改动


哪里不懂可以在评论区留言

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐