栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

计算PI值

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

计算PI值

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))
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/286785.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号