1、Version 1
—因time标准库中的clock()函数被弃用,本程序不能正常运行
from random import random
from math import sqrt
from time import clock
DARTS = 1000
hits = 0.0
clock()
for i in range(1, DARTS+1):
x, y = random(), random()
dist = sqrt(x ** 2 + y ** 2)
if dist <= 1.0:
hits = hits + 1
pi = 4 * (hits/DARTS)
print("PI的值是{}".format(pi))
print("运行时间是:{:.5f}s".format(clock()))
2.Version 2
-将代码中的clock()函数替换为perf_counter函数
from random import random
from math import sqrt
from time import perf_counter
DARTS = 1000000
hits = 0.0
start_time = perf_counter()
for i in range(1, DARTS+1):
x, y = random(), random()
dist = sqrt(x ** 2 + y ** 2)
if dist <= 1.0:
hits = hits + 1
pi = 4 * (hits/DARTS)
print("PI的值是{}".format(pi))
end_time = perf_counter()
print("运行时间是:{:.5f}s".format(end_time-start_time))
3.Version 3
—将抛点数DARTS从固定1000改成可由键盘输入
—一次可测定多次,直至输入为0
—为输入加上异常处理
用蒙特卡罗算法计算PI
from random import random
from math import sqrt
from time import perf_counter
while True:
try:
TotalDots = eval(input("请输入总点数(0结束):"))
except:
print("请输入正整数。")
else:
if TotalDots == 0:
break
else:
TotalHits = 0
start_time = perf_counter()
for i in range(1, TotalDots + 1):
x, y = random(), random()
dist = sqrt(x ** 2 + y ** 2)
if dist <= 1.0:
TotalHits = TotalHits + 1
pi = 4 * (TotalHits / TotalDots)
end_time = perf_counter()
print("总尝试点数为{:d},命中数为{:d},pi的值为{:.15f},耗时为{:.2f}秒".format(TotalDots, TotalHits, pi, end_time - start_time))
4.Version4
—Version3有一个bug,当输入小数时,eval()函数不会触发异常处理,但range()函数会触发
—将eval()函数改成int()函数
from random import random
from math import sqrt
from time import perf_counter
while True:
try:
TotalDots = int(input("请输入总点数(0结束):"))
except:
print("请输入正整数。")
else:
if TotalDots == 0:
break
else:
TotalHits = 0
start_time = perf_counter()
for i in range(1, TotalDots + 1):
x, y = random(), random()
dist = sqrt(x ** 2 + y ** 2)
if dist <= 1.0:
TotalHits = TotalHits + 1
pi = 4 * (TotalHits / TotalDots)
end_time = perf_counter()
print("总尝试点数为{:d},命中数为{:d},pi的值为{:.15f},耗时为{:.2f}秒".format(TotalDots, TotalHits, pi, end_time - start_time))



