gpt4 book ai didi

python - 为什么我的 python 程序没有收敛到 pi?

转载 作者:太空宇宙 更新时间:2023-11-03 11:27:40 25 4
gpt4 key购买 nike

我写了这个方法:

def approx_pi(n, p):
"""
Approximates Pi by putting dots in a square and counting
the dots in the max possible circle in that square.
:param n: Number of dots
:param p: Precision used for urandom
:return: Approximation of Pi
"""
in_circle = 0
k = 100
max_int = (2**(8*p)-1)
for i in range(n):
# get two random Numbers between 0 and 1
x = int.from_bytes(os.urandom(p), byteorder='big')/max_int
y = int.from_bytes(os.urandom(p), byteorder='big')/max_int

if x ** 2 + y ** 2 <= 1:
in_circle += 1

# Just for debugging
if (i+1) % k == 0:
k = int(k*1.01)
print(i, '\t',4*in_circle/i)
sys.stdout.flush()

return 4*in_circle/n

在我的大多数测试运行中,它稳定在 3.141,然后围绕该值发散。这是urandom的弱点吗?但如果是这样,为什么 pi 不朝一个方向移动?还是我的代码有问题。

最佳答案

首先。您的代码非常困惑。最好用一个能让您了解变量含义的名称来调用变量。

我已将代码简化为必要的行。因此,我使用随机库来生成点位置。

这个方法的问题是它收敛的很慢。我得到 10**8 分,得到 3.14167604。

import random


def approx_pi(points):
"""
Approximates Pi by putting dots in a square and counting
the dots in the max possible circle in that square.
:param points: Number of dots
:return: Approximation of Pi
"""
in_circle = 0
for dummy_i in xrange(points):
# get two random Numbers between 0 and 1
x_dot_position = random.random()
y_dot_position = random.random()

if x_dot_position ** 2 + y_dot_position ** 2 <= 1:
in_circle += 1

return 4.0*in_circle/points

编辑你对函数 random.random() 的看法是正确的。所以在接下来的代码中,我使用了 random.random_integers,它是 [low, high] 值之间的均匀分布。

代码是并行化的,我尝试了 10**10 分:

PI = 3.14157765计算时间 = 3790 秒

import multiprocessing
import time
import numpy as np

starting_point = time.time()

def approx_pi(point):
"""
Approximates Pi by putting dots in a square and counting
the dots in the max possible circle in that square.
:param points: Number of dots
:return: Approximation of Pi
"""
# get two random Numbers between 0 and 1
x_dot_position = float(np.random.random_integers(0,10**10))/10**10
y_dot_position = float(np.random.random_integers(0,10**10))/10**10

if x_dot_position ** 2 + y_dot_position ** 2 <= 1:
return 1
else:
return 0

###########################################################

total_points = 1*10**10
paso = 1*10**8

in_circle = 0

for in_este_bucle in xrange(0, total_points, paso):
print "Procesadores disponibles: " + str(multiprocessing.cpu_count())

pool = multiprocessing.Pool()
resultado = pool.map(approx_pi, xrange(in_este_bucle, in_este_bucle + paso))
pool.close()
pool.join()
in_circle += sum(resultado)
del resultado


print 'Total time: ' + str(time.time()-starting_point) +' seconds'
print
print 4.0*in_circle/total_points

关于python - 为什么我的 python 程序没有收敛到 pi?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30853515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com