计算圆周率:
①由公式计算
②蒙特卡罗方法:是一个撒点方法,类似于概率
圆周率本身就是圆形的面积除以外切正方形的面积(如下图所示)。求解圆周率可以采用蒙特卡罗方法,在一个1/4正方形中撒点,根据在圆内点的数量占总撒点数的比例计算圆周率值。
from random import random
from time import perf_counter
DARTS = 1000*1000 #总撒点数量
hits = 0.0 # 目前在圆内部点的数量
strat = perf_counter()
# 模拟每次撒的点,判断是否在圆内
for i in range(1,DARTS+1):
x, y = random(),random()
dist = pow(x ** 2 + y ** 2, 0.5)
if dist <=1.0:
hits = hits + 1
pi = 4 * (hits/DARTS) # 注意要乘上4,因为概率是可以相加的
print("圆周率是:{}".format(pi))
print("运行时间:{:.5f}s".format(perf_counter()-strat))
举一反三:
- 理解方法思维:
- 数学思维—精确的表达式
- 计算机思维——抽象过程,用计算机自动化求解
- 用
time.perf_counter
关注程序的运行时间提高效率
课后习题:请以123作为随机数种子,获得用户输入的撒点数量,编写程序输出圆周率的值,保留小数点后6位。
import random as r
dots = eval(input())
in_circle = 0
# 注意种子如果放在循环体内部,程序的输出结果不正确且相同。
# (在每个for循环中,产生的初始随机数都一样,则对于每个点,x,y都是相同的)
r.seed(123)
for i in range(1,dots+1):
x,y = r.random(),r.random()
dis = x ** 2 + y ** 2
if dis <= 1:
in_circle += 1 #是+=
pi = 4 * (in_circle/dots)
print("{:.6f}".format(pi))
"水仙花数"是指一个三位整数,其各位数字的3次方和等于该数本身。
s = []
# 因为是三位数,最高位不能为0
for a in range(1,10,1):
for b in range(0,10,1):
for c in range(0,10,1):
three = a**3+b**3+c**3
abc=a*100+b*10+c
if int(three) == int(abc):
s.append(abc) # 注意,对于列表,用s=s.append(),因为append返回的是一个空值None
S = str(s)[1:-1]
print(S)
参考答案
s = ""
for i in range(100, 1000):
t = str(i)
if pow(eval(t[0]),3) + pow(eval(t[1]),3) + pow(eval(t[2]),3) == i :
s += "{},".format(i)
print(s[:-1])