用python做蒙特卡洛仿真算法

用python做蒙特卡洛仿真算法

  1. 在(0,1)区间里随机取两个数,求它们的差值小于0.5的概率。请编写python 程序,利用蒙特卡罗仿真方法来求解该问题。
  2. 在(0,1)区间里随机取两个数,求它们的平方和小于1的概率。请编写python 程序,利用蒙特卡罗仿真方法来求解该问题。
  3. 假设一个班上有30名同学,都是1997年出生,问其中至少有两名同学生日相同的概率是多少?(假设没有平年和闰年的区别,一年只有365天)请编写python
    程序,利用蒙特卡罗仿真方法来求解该问题。
    问题1代码:
    思路:
    在0到1之间打一万个点
    找出他们之间差值小于0.5的点数
    求出他们的比值即为概率
DARTS=10000
hits=0.0
for i in range(1,DARTS+1):
    x,y=random(),random()
    dis=abs(x-y)
    if dis<0.5:
        hits=hits+1
p=hits/DARTS
print("求出的值为{}".format(p))
print("理论值{}".format(0.75))

问题二代码:
思路:
跟上述问题类似,这里可以求出圆的面积所占的百分比

from random import random
import math
def x():
    DARTS = 10000
    hits = 0.0
    for i in range(1, DARTS + 1):
        x, y = random(), random()
        dis = x * x + y * y
        if dis < 1:
            hits = hits + 1
    p = (hits / DARTS)
    print("求出的值为{}".format(p))
    print("理论值为{}".format(math.pi / 4))
if __name__=="__main__":
    x()

问题3代码:思路
利用向类似的方法,并且去重复可以用集合,
从而判断是否有人的生日是否是同一天

from random import randint
import math
DARTS=10000
hits=0.0
for i in range(1,DARTS+1):
    a = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    b = set()
    for m in range(30):
        a[m]=randint(1,365)
    for j in range(30):
        b.add(a[j])
    if len(b)<30:
        hits=hits+1
p=hits/DARTS
print("求出的值为{}".format(p))
s=1.0
for i in range(0,30):
    s*=(365-i)/365
print("理论值是{}".format(1-s))

理论值:

Lab1.1 理论值: 0.75

Lab1.2 理论值:pi / 4

Lab1.3 理论值:自己算法吧

  • 3
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jason48_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值