目录
前言:
撒豆求pi是我刚刚开始学习python进行的一项练习。由于专业原因,我多年未接触数学等逻辑性强的学科,逻辑思维非常之差,这个看似简单的练习却让我绞尽脑汁。其中,难免会出现代码复杂等问题。还望大家多多海涵,指出不足。
思路:
pi其实就是半径为1的圆的面积。这里我的圆心坐标为(0,0)
一个半径为1,直径为2的圆,正好可以内切一个边长为2的正方形。已知正方形面积为4,如何利用随机撒豆求出pi的近似值?
控制撒豆数量,随机抛到正方形内部,其实可以发现,有的豆子落在圆内,有的豆子落在了圆外。统计落在圆内豆子的数量。
如何统计?很简单,圆边到圆心的距离恒等于1,已知点的坐标,用勾股定理即可求出到愿心的距离
为了方便,我们可以取1/4圆进行测试,结果x4,即为pi值。
撒豆数量越大,pi值越准确。
代码:
import matplotlib.pyplot as plt
import random as rd
import numpy as np
plt.figure(figsize=(20, 8), dpi=150)
plt.axis('equal') # 让xy坐标长度相等,不写的话圆不成圆
dots = 100**2 # 随机撒点
hits = 0 # 表示点在圆圈内
kx = []
ky = []
for i in range(dots+1): # 用for循环,dots多少次就撒多少次,注意末尾数字要+1
x = rd.random() # random.random()表示的就是[0, 1)之间的随机数
y = rd.random() # 其实可以和x合并在一起
kx.append(x)
ky.append(y)
if pow(x**2 + y**2, 0.5) <= 1: # pow函数是求次方的函数,pow(底数, 指数, 余数)
hits += 1 # if条件句判断点是否点在了圆圈内,如果在则+1
pi = hits / dots * 4 # 上述内容只考虑了四分之一的圆
print(pi) # 同理,最后依然要进行调用,
plt.scatter(kx, ky, s=0.01)
· 第一个for循环中x和y在随机取数,取出来的坐标放到kx和ky列表中
结果如下:
如何不利用pi画出圆?
下面的代码仅供大家参考,此时半径为0.5:
plt.title = "求圆的面积"
a = [0, 0.5, 1, 1, 1, 0.5, 0, 0, 0]
b = [0, 0, 0, 0.5, 1, 1, 1, 0.5, 0]
plt.plot(a, b)
plt.color = 'b'
# 根据坐标绘制图形
r = 0.5
c, d = (0.5, 0.5)
x1 = np.arange(0, c, 0.001)
x2 = np.arange(c, c+r, 0.001)
# 使用numpy中arange函数,创建给定区间的数值数组。三个参数:start, end, step.
# arange属于创建区间数组。
y1 = r + np.sqrt(r**2 - (r - x1)**2)
y2 = r - np.sqrt(r**2 - (r - x1)**2)
y3 = r + np.sqrt(r**2 - (x2 - r)**2)
y4 = r - np.sqrt(r**2 - (x2 - r)**2)
plt.plot(x1, y1)
plt.color = 'y'
plt.plot(x1, y2)
plt.color = 'r'
plt.plot(x2, y3)
plt.color = 'g'
plt.plot(x2, y4)
plt.color = 'k'
plt.show()