- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我创建了一个简单的 python 程序,它通过计算适合圆的 1 像素点的数量来计算 pi。起初我使用以下值运行程序:
from tkinter import *
tk = Tk()
canvas = Canvas(tk, width=400, height=400)
canvas.pack()
canvas.create_oval(100,100,400,400)
global pi_count
pi_count = 0
for x in range(100,400):
for y in range(100,400):
point = canvas.create_oval(x,y,(x+1),(y+1))
c = canvas.coords(point)
sc = list(c)
xc = sc[1]
yc = sc[2]
fxc = int(xc)
fyc = int(yc)
dist = ((fxc - 250)**2 + (fyc - 250)**2)**0.5
if dist > 150:
print("outside of the circle")
else:
pi_count += 1
print(pi_count)
pi = (pi_count/150**2)
print(pi)
这给了我输出 3.1412888889。
我对这个结果比较满意,我将椭圆尺寸更改为(100,100,500,500)
并相应地更改所有其他值(半径、for 循环等)。
然而,这个更大的圆圈和可能更准确的区域产生了更不准确的估计值 3.140675。
这是为什么,我该如何修复计算器以提供更准确的估算值?
编辑
这里是经过编辑和改进的代码,更易于测试:
from tkinter import *
MIN_POS = 100
MAX_POS = 300
center = (MAX_POS + MIN_POS)/2
radius = (MAX_POS - MIN_POS)/2
tk = Tk()
canvas = Canvas(tk, width=MAX_POS, height=MAX_POS)
canvas.pack()
canvas.create_oval(MIN_POS,MIN_POS,MAX_POS,MAX_POS)
global pi_count
pi_count = 0
for x in range(MIN_POS,MAX_POS):
for y in range(MIN_POS,MAX_POS):
point = canvas.create_oval(x,y,(x+1),(y+1))
c = canvas.coords(point)
sc = list(c)
xc = sc[1]
yc = sc[2]
fxc = int(xc)
fyc = int(yc)
dist = ((fxc - center)**2 + (fyc - center)**2)**0.5
if dist > radius:
print("outside of the circle")
else:
pi_count += 1
print(pi_count)
pi = (pi_count/radius**2)
print(pi)
如果任何拥有快速计算机的人都可以运行此程序,并且 Max_pos
以 100 的步长递增,我将不胜感激。
最佳答案
这种方法很不准确。测试一个半径的结果可能比 1 个或更多更准确或更不准确:
100 -> 3.141700 ~ 1.000034
125 -> 3.140928 ~ 0.999788
150 -> 3.141378 ~ 0.999932
175 -> 3.141518 ~ 0.999976
200 -> 3.140725 ~ 0.999724
225 -> 3.141393 ~ 0.999936
250 -> 3.141136 ~ 0.999855
275 -> 3.140826 ~ 0.999756
300 -> 3.141078 ~ 0.999836
325 -> 3.141311 ~ 0.999910
350 -> 3.140939 ~ 0.999792
375 -> 3.141582 ~ 0.999997
400 -> 3.141406 ~ 0.999941
原因是您仅测试整数值,因此这些值往往会向下舍入。虽然增加半径确实会提高精度,但在您超过 Python 的浮点精度本身的限制之前,应该不可能获得具有足够小数的 π——我不知道为此需要多大的半径。
对于您的值 150,测试 149 和 151 也表明两者都不是“更好”; 两者都更糟!
150 -> 3.141378 ~ 0.999932
-1 -> 3.140804 ~ 0.999749
+1 -> 3.140783 ~ 0.999742
即使对于非常大的半径,例如 10,000,您仍然会得到 3.141591 ~ 0.999999(计算需要一段时间)。
使用以下代码进行测试(不使用图形显示)。请注意,您的代码中有一个小错误,它也会影响结果!您运行的范围是 (100,400)
,您也可以将其写为 (0,300)
。减去半径,您有 (-150,150)
– 但 Python 的 range
函数从 start
to less than stop
运行.这意味着您正在计算 -150..-1
,然后是 0
,然后是 1..149
,并且对离开了。
(但是,考虑到这一点并没有明显提高准确性。)
import math
def calc_pi(radius):
pi_count = 0
rad2 = radius*radius
for x in range(-radius,radius+1):
x2 = x*x
for y in range(-radius,radius+1):
dist = x2 + y*y
if dist <= rad2:
pi_count += 1
return float(pi_count)/radius**2
for i in range(100,401,25):
result = calc_pi(i)
print("%d -> %f ~ %f" % (i, result, result/math.pi))
关于python - Pi 计算器输出问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48725383/
我正在使用 OUTFILE 命令,但由于权限问题和安全风险,我想将 shell 的输出转储到文件中,但出现了一些错误。我试过的 #This is a simple shell to connect t
我刚刚开始学习 Java,我想克服在尝试为这个“问题”创建 Java 程序时出现的障碍。这是我必须创建一个程序来解决的问题: Tandy 喜欢分发糖果,但只有 n 颗糖果。对于她给第 i 个糖果的人,
你好,我想知道我是否可以得到一些帮助来解决我在 C++ 中打印出 vector 内容的问题 我试图以特定顺序在一个或两个函数调用中输出一个类的所有变量。但是我在遍历 vector 时收到一个奇怪的错误
我正在将 intellij (2019.1.1) 用于 java gradle (5.4.1) 项目,并使用 lombok (1.18.6) 来自动生成代码。 Intellij 将生成的源放在 out
编辑:在与 guest271314 交流后,我意识到问题的措辞(在我的问题正文中)可能具有误导性。我保留了旧版本并更好地改写了新版本 背景: 从远程服务器获取 JSON 时,响应 header 包含一
我的问题可能有点令人困惑。我遇到的问题是我正在使用来自 Java 的 StoredProcedureCall 调用过程,例如: StoredProcedureCall call = new Store
在我使用的一些IDL中,我注意到在方法中标记返回值有2个约定-[in, out]和[out, retval]。 当存在多个返回值时,似乎使用了[in, out],例如: HRESULT MyMetho
当我查看 gar -h 的帮助输出时,它告诉我: [...] gar: supported targets: elf64-x86-64 elf32-i386 a.out-i386-linux [...
我想循环遍历一个列表,并以 HTML 格式打印其中的一部分,以代码格式打印其中的一部分。所以更准确地说:我想产生与这相同的输出 1 is a great number 2 is a great
我有下面的tekton管道,并尝试在Google Cloud上运行。集群角色绑定。集群角色。该服务帐户具有以下权限。。例外。不确定需要为服务帐户设置什么权限。
当尝试从 make 过滤非常长的输出以获取特定警告或错误消息时,第一个想法是这样的: $ make | grep -i 'warning: someone set up us the bomb' 然而
我正在创建一个抽象工具类,该类对另一组外部类(不受我控制)进行操作。外部类在某些接口(interface)点概念上相似,但访问它们相似属性的语法不同。它们还具有不同的语法来应用工具操作的结果。我创建了
这个问题已经有答案了: What do numbers starting with 0 mean in python? (9 个回答) 已关闭 7 年前。 在我的代码中使用按位与运算符 (&) 时,我
我写了这段代码来解析输入文件中的行输入格式:电影 ID 可以有多个条目,所以我们应该计算平均值输出:**没有重复(这是问题所在) import re f = open("ratings2.txt",
我需要处理超过 1000 万个光谱数据集。数据结构如下:大约有 1000 个 .fits(.fits 是某种数据存储格式)文件,每个文件包含大约 600-1000 个光谱,其中每个光谱中有大约 450
我编写了一个简单的 C 程序,它读取一个文件并生成一个包含每个单词及其出现频率的表格。 该程序有效,我已经能够在 Linux 上运行的终端中获得显示的输出,但是,我不确定如何获得生成的显示以生成包含词
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
1.普通的输出: print(str)#str是任意一个字符串,数字··· 2.格式化输出: ?
我无法让 logstash 正常工作。 Basic logstash Example作品。但后来我与 Advanced Pipeline Example 作斗争.也许这也可能是 Elasticsear
这是我想要做的: 我想让用户给我的程序一些声音数据(通过麦克风输入),然后保持 250 毫秒,然后通过扬声器输出。 我已经使用 Java Sound API 做到了这一点。问题是它有点慢。从发出声音到
我是一名优秀的程序员,十分优秀!