您的位置:首页 > 编程语言

(蒙特卡洛方法)求任意一点(X,Y)落在心形区域的概率(2017阿里在线编程题)

2017-10-15 23:09 549 查看
这个题首先2和3看不清坑了很多人,应该是3次方而不是2次方



真是看瞎了自己的钛合金狗眼啊 = =

不多说,上高清大图:



看到这个题目,第一反应就是蒙特卡洛方法,现在来介绍一下什么是蒙特卡洛方法,其实很简单的定义,即:

当所求解问题是某种随机事件出现的概率,或者是某个随机变量的期望值时,通过某种“实验”的方法,以这种事件出现的频率估计这一随机事件的概率,或者得到这个随机变量的某些数字特征,并将其作为问题的解。

通俗点说就是,这个概率我用数学方法求不出来了,我用计算机程序暴力模拟,用模拟结果中该事件发生的频率除以模拟的总次数来估计该事件的概率。

举个例子,我要求抛硬币正面朝上的概率,我就丢了1000000次硬币,其中正面朝上的次数大概有500000次,所以正面朝上的概率为50%.

这就是所谓的蒙特卡洛方法。

回到正题:

题目要求一横纵坐标都服从正态分布的点落入心形区域的概率,于是可以使用python程序模拟题中的事件,生成100万个符合题设要求的点,看有多少个点落入心形区域,最后用落入区域点的数量m/1000000即是估计出的所求的概率。

此处用标准正态分布为例:

import numpy as np
sum = 0#用于统计落入心形区域中的点的频率
for i in range(1000000):#模拟100万次
x=np.random.randn()
y=np.random.randn()
if (x**2 + y**2 - 1)**3 - (x**2)*(y**3) < 0:#落入心形区域中的点都会满足该不等式
sum = sum + 1
print sum
print float(sum)/1000000


输出结果如下:



于是得到一个横纵坐标都服从标准正态分布的点落入心形区域的概率大概为42.4%
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  机器学习 阿里