在以下问题上有问题:
在几何学中,圆周与其直径之比称为π。π的值可以从以下形式的无限级数中估计:
π/4=1- (1/3) + (1/5) - (1/7) + (1/9) - (1/11) +还有另一种计算π的新方法。想象一下,你有一个省道板,是两个单位的平方。上面刻有一个单位半径的圆圈。圆心与正方形中心重合。现在想象一下,你随机地向飞镖板扔飞镖。那么,圆内飞镖的数量与掷出的飞镖总数的比率与圆面积与方省道板面积之比是相同的。具有单位半径的圆的面积就是π平方单位。省道板的面积为4平方单位。圆面积与正方形面积之比为π/ 4。
为了模拟投掷飞镖,我们将使用一个随机数生成器。所述随机模块具有多个可使用的随机数生成函数。例如,统一函数(a,b)返回a(包括)和b(独占)范围内的浮点随机数。
想象一下,正方形飞镖板上有一个坐标系。右上角有坐标( 1.0,1.0),左下角有坐标( -1.0,-1.0 )。它有两个单位长的边,它的中心(以及内切圆的中心)在原点。
省道板内的随机点可以由x和y坐标指定。这些值是使用随机数生成器生成的。我们实现这一目标的方式是:
xPos = random.uniform (-1.0, 1.0)
yPos = random.uniform (-1.0, 1.0)
要确定一个点是否在圆内,它与圆心的距离必须严格小于圆的半径。坐标点(xPos,yPos)与中心的距离是math.hypot ( xPos,yPos )。圆的半径是1单位。
您将要编写的程序将称为CalculatePI。它将有以下结构:
import math
import random
def computePI ( numThrows ):
...
def main ():
...
main()
函数main()将为给定数量的抛出调用函数computePI()。函数computePI()将通过为x和y坐标生成随机数来模拟飞镖的抛出。您将确定该随机生成的点是否在圆内。您将按照抛出数指定的次数执行此操作。你将记录飞镖在圆圈内着陆的次数。这个计数除以抛出的总数为π/4。函数π()将返回PI的计算值。在函数main()中,您需要进行实验,看看PI的准确性是否随着飞镖板上抛出的次数而增加。您将将您的结果与math.pi提供的值进行比较。输出的数量差异是PI减去math.pi的计算值。使用下面的抛出数运行您的实验-100、1000、10,000、100,000、1,000,000和10,000,000。您将使用这些数字作为输入参数调用函数computePI()。您的输出将类似于以下内容,即计算出的PI和差值的实际值将有所不同,但接近所示的值:
Computation of PI using Random Numbers
num = 100 Calculated PI = 3.320000 Difference = +0.178407
num = 1000 Calculated PI = 3.080000 Difference = -0.061593
num = 10000 Calculated PI = 3.120400 Difference = -0.021193
num = 100000 Calculated PI = 3.144720 Difference = +0.003127
num = 1000000 Calculated PI = 3.142588 Difference = +0.000995
num = 10000000 Calculated PI = 3.141796 Difference = +0.000204
Difference = Calculated PI - math.pi
您的输出必须采用上述格式。抛出的次数必须是正确的。π的计算值和差值必须正确表示为小数点的6位。差额上应该有正负号。阅读书中有关格式化的相关章节。
,直到现在我做了:
import math
import random
def computePI (numThrows):
xPos = random.uniform (-1.0, 1.0)
yPos = random.uniform (-1.0, 1.0)
in_circle = 0
throws = 0
while (throws < numThrows):
if math.hypot (xPos, yPos) <= 1:
in_circle += 1
throws += 1
pi = (4 * in_circle) / numThrows
return pi
def main ():
throws = (100, 1000, 10000, 100000, 1000000, 10000000)
for numThrows in throws[0:7]:
main ()
我在主函数中调用ComputePI函数时遇到了问题。此外,如何打印带左缩进的num,并确保所有数字都有所需的十进制空间?谢谢你!
发布于 2017-10-15 09:22:44
您的程序有三个主要问题:
computePI()
函数时,这些行只执行一次。然后继续计算hypot
的相同值,用于数百次甚至数千次迭代。将这些行放在的these循环中。in_circle
和numThrows
都是整数,所以这个计算将使用整数算法(至少在Python2中)。将常量从4
更改为4.0
将更改为浮点计算:
pi = (4.0 * in_circle) / numThrowsmain()
函数:
不需要使用throws
元组的子集,也没有在for
循环中添加一个主体。试试这个:
对于numThrows,在(100,1000,10000,100000,1000000,10000000)中: randpi = computePI(numThrows) diff = randpi - math.pi打印"num = %-8d计算的PI = %8.6f差= %+9.6f“%\ (numThrows,randpi,diff)发布于 2020-05-30 08:23:29
这就是我觉得很简单的方式。
import random
import math
def approximate_pi():
total_points = 0
within_circle = 0
for i in range (10000):
x = random.random()
y = random.random()
total_points += 1
distance = math.sqrt(x**2+y**2)
if distance < 1:
within_circle += 1
if total_points % 1000 == 0:
pi_estimate = 4 * within_circle / total_points
yield pi_estimate
将生成的总点和圆点设置为零。
total_points = 0
within_circle = 0
多次生成x和y的随机值。计算点与圆心或(0,0)之间的距离。如果距离小于1,它意味着它在圆内,所以它是递增的。
distance = math.sqrt(x**2+y**2)
if distance < 1:
within_circle += 1
现在,如果您已经生成了1000的倍数(因为我们取了10,000的范围,所以得到了10,000π的值),那么使用这个公式计算pi的估计值,这个公式是already.and绑定的估计值(Pi_estmate)。
if total_points % 1000 == 0:
pi_estimate = 4 * within_circle / total_points
yield pi_estimate
pi_estimates = list(es for es in approximate_pi())
errors = list(estimate-math.pi for estimate in approximate_pi())
print(pi_estimates)
print(errors)
输出:
估计
[3.096, 3.142, 3.1253333333333333, 3.121, 3.1384, 3.136, 3.1314285714285712, 3.133, 3.1342222222222222]
误差
[0.04240734641020705, 0.02240734641020703, 0.03307401307687341, 0.020407346410206806, 0.02320734641020694, 0.0017406797435404187, -0.009021225018364554, -0.011592653589793223, -0.016703764700904067]
希望你能理解,我希望我的解释容易理解,我是初学者,如果有什么问题,请随时通知。谢谢
发布于 2020-09-08 11:29:09
从本质上说,你上面写的声明是这样写的:
import math
def find_pi(iterations):
return sum(
1 for _ in range(iterations) if math.hypot(
random.random(), random.random()) <= 1) * 4.0/iterations
https://stackoverflow.com/questions/46751718
复制相似问题