我是这里的新成员,我将直接投入其中,因为我整个星期天都在努力解决这个问题。
我是 Python 的新手,之前学习过 C++ 编码,达到基础中级水平(这是一个为期 10 周的大学模块)。
我正在尝试几种迭代技术来计算 Pi,但两者都略有不准确,我不确定为什么。
我在大学里学到的第一种方法 - 我敢肯定你们中的一些人以前见过这种方法。
x=0.0
y=0.0
incircle = 0.0
outcircle = 0.0
pi = 0.0
i = 0
while (i<100000):
x = random.uniform(-1,1)
y = random.uniform(-1,1)
if (x*x+y*y<=1):
incircle=incircle+1
else:
outcircle=outcircle+1
i=i+1
pi = (incircle/outcircle)
print pi
它本质上是一个在两个轴上从 -1 到 +1 的平面上生成随机 (x,y) 坐标的生成器。然后如果 x^2+y^2 <= 1,我们知道该点位于坐标轴形成的框内半径为="" 1="">=>
根据点的位置,incircle 或 outcircle 的计数器增加。
pi 的值就是圆圈内外的值之比。坐标是随机生成的,因此应该是均匀分布的。
然而,即使在非常高的迭代值下,我对 Pi 的结果也始终在 3.65 左右。
第二种方法是另一种迭代,计算一个多边形的周长,边数递增,直到多边形几乎是一个圆,那么,Pi=周长/直径。 (我有点被骗了,因为编码中有一个 math.cos(Pi) 项,所以看起来我正在使用 Pi 来查找 Pi,但这只是因为你不能轻易地使用度数来表示 Python 上的角度)。但即使是多次迭代,最终结果似乎也在 3.20 左右结束,这又是错误的。代码在这里:
S = 0.0
C = 0.0
L = 1.0
n = 2.0
k = 3.0
while (n<2000):
S = 2.0**k
L = L/(2.0*math.cos((math.pi)/(4.0*n)))
C = S*L
n=n+2.0
k=k+1.0
pi = C/math.sqrt(2.0)
print pi
我记得,在我的 C++ 类(class)上,有人告诉我这个问题很常见,这不是数学问题,而是编码中的某些问题,但我记不清了。这可能与随机数生成有关,或者与使用 float 的限制有关,或者……任何事情。它甚至可能只是我的数学......
谁能想到问题出在哪里?
TL;DR:在尝试计算 Pi 时,无论我进行多少次迭代,我都可以接近它但永远不会非常准确。
(哦,还有一点 - 在第二个代码中有一行说 S=2.0**k。如果我将“n”设置为高于 2000 的任何值,S 的值将变得太大而无法处理,并且代码会崩溃。我该如何解决这个问题?)
谢谢!
最佳答案
您的第一个版本的算法应该更像这样:
from __future__ import division, print_function
import sys
if sys.version_info.major < 3:
range = xrange
import random
incircle = 0
n = 100000
for n in range(n):
x = random.random()
y = random.random()
if (x*x + y*y <= 1):
incircle += 1
pi = (incircle / n) * 4
print(pi)
打印:
3.14699146991
这更近了。增加 n 以更接近 pi。
algorithm仅考虑单位圆的四分之一,即半径为 1。
四分之一圆的面积公式为:
area_c = (pi * r **2) / 4
包含这个圆的正方形的面积:
area_s = r **2
其中 r 是圆的半径。
现在比率是:
area_c / area_s
代入上面的等式,重新排列,你得到:
pi = 4 * (area_c / area_s)
使用蒙特卡洛,只需用代表它们的非常高的数字替换这两个区域。通常,这里使用随机 throw 飞镖的类比。
关于python - 无法在 Python 上准确计算圆周率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34840741/
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
我正在尝试在我的centos服务器上安装therubyracer,但遇到了麻烦。$geminstalltherubyracerBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtherubyracer:ERROR:Failedtobuildgemnativeextension./usr/local/rvm/rubies/ruby-1.9.3-p125/bin/rubyextconf.rbcheckingformain()in-lpthread...yescheckingforv8.h...no***e
我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳
这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,
我在pry中定义了一个函数:to_s,但我无法调用它。这个方法去哪里了,怎么调用?pry(main)>defto_spry(main)*'hello'pry(main)*endpry(main)>to_s=>"main"我的ruby版本是2.1.2看了一些答案和搜索后,我认为我得到了正确的答案:这个方法用在什么地方?在irb或pry中定义方法时,会转到Object.instance_methods[1]pry(main)>defto_s[1]pry(main)*'hello'[1]pry(main)*end=>:to_s[2]pry(main)>defhello[2]pry(main)
我使用的是Firefox版本36.0.1和Selenium-Webdrivergem版本2.45.0。我能够创建Firefox实例,但无法使用脚本继续进行进一步的操作无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055)错误。有人能帮帮我吗? 最佳答案 我遇到了同样的问题。降级到firefoxv33后一切正常。您可以找到旧版本here 关于ruby-无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055),我们在StackOverflow上找到一个类
当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub