Python-蒙特·卡罗方法计算圆周率近似值、筛选法求素数、猜数游戏

1、使用蒙特·卡罗方法计算圆周率近似值

蒙特· 卡罗方法是一种通过概率来得到问题近似解的方法, 在很多领域都有重要的应用,其中就包括圆周率近似值的计算问题。假设有一块边长为 2 的正方形木板,上面
画一个单位圆,然后随意往木板上扔飞镖,落点坐标(x, y)必然在木板上(更多的时候是落在单位圆内),如果扔的次数足够多,那么落在单位圆内的次数除以总次数再乘以 4,这个数字会无限逼近圆周率的值。这就是蒙特·卡罗发明的用于计算圆周率近似值的方法,如图所示。
在这里插入图片描述
模拟蒙特·卡罗计算圆周率近似值的方法,输入掷飞镖次数,然后输出圆周率近似值。

from random import random

times=int(input('请输入掷飞镖次数:'))
hits=0
for i in range(times):   #循环
    x=random()           #产生随机数
    y=random()
    if x*x+y*y<=1:
        hits+=1
print(4.0*hits/times)

运行结果如下:
在这里插入图片描述

2、使用列表实现筛选法求素数

编写程序,输入一个大于 2 的自然数,然后输出小于该数字的所有素数组成的列表。
使用内置函数,enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。filter()函数用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,可以通过list()转化为列表或者通过for循环取值。

maxNumber=int(input('请输入一个大于2的自然数:'))
lst=list(range(2,maxNumber))
m=int(maxNumber**0.5)                 #最大整数的平方根
for index,value in enumerate(lst):
    if value>m:                       #如果当前数字已大于最大整数平方根,结束判断
        break
    lst[index+1:]=filter(lambda x:x%value !=0, lst[index+1:])  #对该位置之后的元素进行过滤
print(lst)

运行结果如下:
在这里插入图片描述

3、猜数游戏

编写程序模拟猜数游戏。程序运行时,系统生成一个随机数,然后提示用户进行猜测,并根据用户输入进行必要的提示(猜对了、太大了、太小了),如果猜对则提前结束程序,如果次数用完仍没有猜对,提示游戏结束并给出正确答案。
用random产生随机数。try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。用循环来将猜测值与随机值做比较,来验证是否猜测正确。

from random import randint

def guessNumber(maxValue=10,maxTimes=3):
    value=randint(1,maxValue)       #产生随机数
    for i in range(maxTimes):
        prompt='Start to guess:' if i==0 else 'Guess again:'
        try:                       #异常处理结构,防止输入不是数字的情况
            x=int(input(prompt))
        except:
            print('Must input an integer between 1 and',maxValue)
        else:
            if x==value:        #数字猜对的情况
                print('Congratulation!')
                break
            elif x>value:      #猜测的数字太大了
                print('Too big!')
            else:              #猜测的数字太小了
                print('Too little!')
    else:                      #猜错三次后,游戏失败
        print('Game over. FAIL!')
        print('The value is',value)
guessNumber()

运行结果如下:
在这里插入图片描述

  • 9
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 这是一个关于模拟蒙特卡罗计算圆周率近似值方法问题。输入获取飞镖次数,然后输出圆周率近似值蒙特卡罗方法一种通过随机抽样来近似计算数学问题方法,在很多领域都有要的应用,其中包括圆周率近似计算问题。利用这种方法,我们可以在很多领域中计算出近似值,其中就包括计算圆周率近似值问题。 ### 回答2: 定半径为1的圆,以及一个可以完全覆盖这个圆的正方形。我们可以用蒙特·卡罗方法来获取这个圆周率近似值。将这个圆和正方形放在一个平面直角坐标系中,每次通过随机产生一个二元组 (x, y) 来模拟一个投飞镖的过程。如果这个点 (x, y) 落在圆内,我们就记录下这个投飞镖的过程,否则就暂不记录。最后,我们统计出有多少个 投飞镖的过程在圆内,也就是随机点被投中的次数。这个数量可以用来近似圆的面积。 具体而言,我们可以通过这个比率来近似圆周率,公式为 pi ≈ 4 * (圆内投中点数) / (总投掷点数)。换一种说法,我们可以得到这个比率的误差会随着投掷的次数越来越小。随着投掷的次数越来越多,这个比率就会趋近真实值。这个过程可以用下面的样例代码实现: ```python import random n = int(input("请输入掷飞镖的次数:")) count = 0 for i in range(n): x, y = random.uniform(-1, 1), random.uniform(-1, 1) if x**2 + y**2 <= 1: count += 1 pi = 4 * count / n print("圆周率的近似值为:", pi) ``` 这个代码会生成随机的 (x, y) 落在正方形中,然后判断如果它在圆内,就将 count 加一。 这个蒙特·卡罗方法的妙处在于,我们不需要用析式或者微积分来计算圆周率,而只需要用随机模拟方法来实现。这种方法的效率比经典的圆周率推导方法甚至高得多,因为这个方法可以并行计算(每个投飞镖的过程都是独立的),而且可以用更高的维数来推导更高的性质。 ### 回答3: 片正方形,其边长为2,内切一个半径为1的圆形。如果我们在这个正方形中随机掷飞镖,并统计掷在圆形内的飞镖数量,根据概率统计原理,圆形面积与正方形面积的比值应该接近于在圆形内掷飞镖的次数与总掷飞镖次数的比。我们可以用这个比值来近似计算圆的面积和周长。 具体地,我们可以计算在一个足够大的正方形中,掷飞镖的次数$n$,比如$n=1000000$,然后按随机方式生成飞镖的坐标$(x, y)$,将坐标点与圆心的距离$r =\sqrt{x^2+y^2}$与半径$r_0=1$作比较,如果$r \leq r_0$,则这个坐标点在圆形内,否则在圆形外。我们统计在圆形内的坐标点数量$m$,则圆形面积与正方形面积的比值可以近似表示为: $$\frac{\pi}{4} \approx \frac{m}{n}$$ 则圆的周长近似为: $$\pi \approx \frac{4m}{n}$$ 需要注意的是,掷飞镖的坐标必须是随机的,不能有任何规律可循,否则可能导致输出结果偏差较大。 下面是使用Python语言实现模拟蒙特· 卡罗计算圆周率的代码示例: ```python import random # 输入掷飞镖次数 n = int(input("请输入掷飞镖次数:")) # 统计掷在圆形内的飞镖数量 m = 0 for i in range(n): x, y = random.uniform(-1, 1), random.uniform(-1, 1) if x**2 + y**2 <= 1: m += 1 # 输出圆周率的近似值 pi = 4 * m / n print("圆周率的近似值为:", pi) ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值