如何用Python或C++求PI?不借助模块?
rt{:9_241:}要用代码实现 要用Python或C++来求π,可以使用著名的蒙特卡洛方法。蒙特卡洛方法是一种基于概率的数值计算技术,通过随机采样来估算数值。求π的蒙特卡洛方法是基于圆的面积与正方形面积的比例来进行估算。
以下是使用Python的示例代码:
import random
def estimate_pi(num_samples):
inside_circle = 0
for _ in range(num_samples):
x = random.random()
y = random.random()
distance_squared = x2 + y2
if distance_squared <= 1:
inside_circle += 1
return (inside_circle / num_samples) * 4
num_samples = 1000000# 可自行调整样本数量
result = estimate_pi(num_samples)
print("估算的π值为:", result)
这段代码通过在单位正方形内随机生成点,并计算落入单位圆内的点的数量。然后通过计算落入圆内点数与总点数的比例,乘以4得到π的估算值。样本数量越大,估算值越接近π。
使用C++的示例代码如下:
#include <iostream>
#include <random>
double estimate_pi(int num_samples) {
int inside_circle = 0;
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_real_distribution<double> dis(0.0, 1.0);
for (int i = 0; i < num_samples; ++i) {
double x = dis(gen);
double y = dis(gen);
double distance_squared = x * x + y * y;
if (distance_squared <= 1) {
inside_circle++;
}
}
return static_cast<double>(inside_circle) / num_samples * 4;
}
int main() {
int num_samples = 1000000;// 可自行调整样本数量
double result = estimate_pi(num_samples);
std::cout << "估算的π值为: " << result << std::endl;
return 0;
}
这段C++代码与Python的实现类似,使用随机数生成器来生成0到1之间的随机点,并计算落入单位圆内的点的数量,最后根据比例得出π的估算值。
请注意,蒙特卡洛方法是一种估算方法,估算值的精度受样本数量的影响,样本数量越大,估算值越接近真实值π。同时,蒙特卡洛方法在计算π时相对简单,但不如其他算法在效率上高效。 要用Python或C++求π(PI),不依赖于现有的模块,可以使用著名的蒙特卡洛方法来近似计算π的值。以下是使用Python和C++编写的示例代码:
Python代码:
import random
def estimate_pi(num_points):
points_inside_circle = 0
points_total = num_points
for _ in range(num_points):
x = random.uniform(0, 1)
y = random.uniform(0, 1)
distance = x**2 + y**2
if distance <= 1:
points_inside_circle += 1
pi_estimate = 4 * points_inside_circle / points_total
return pi_estimate
num_points = 1000000
estimated_pi = estimate_pi(num_points)
print("估算的π值为:", estimated_pi)
C++代码:
#include <iostream>
#include <random>
double estimatePi(int numPoints) {
int pointsInsideCircle = 0;
int pointsTotal = numPoints;
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_real_distribution<double> dis(0.0, 1.0);
for (int i = 0; i < numPoints; i++) {
double x = dis(gen);
double y = dis(gen);
double distance = x * x + y * y;
if (distance <= 1.0) {
pointsInsideCircle++;
}
}
double piEstimate = 4.0 * pointsInsideCircle / pointsTotal;
return piEstimate;
}
int main() {
int numPoints = 1000000;
double estimatedPi = estimatePi(numPoints);
std::cout << "估算的π值为:" << estimatedPi << std::endl;
return 0;
}
这些代码使用蒙特卡洛方法生成随机点,并计算落在单位圆内的点的比例。通过将该比例乘以4,可以得到对π的近似估计。请注意,这种方法是一种概率性的近似,所以计算结果可能不够精确。增加num_points(Python)或numPoints(C++)的值可以提高估计的准确性。
如果问题已经解决,请设置最佳答案 isdkz 发表于 2023-7-30 12:34
要用Python或C++来求π,可以使用著名的蒙特卡洛方法。蒙特卡洛方法是一种基于概率的数值计算技术,通过随 ...
python代码无法运行{:10_277:} 陶远航 发表于 2023-7-30 12:35
要用Python或C++求π(PI),不依赖于现有的模块,可以使用著名的蒙特卡洛方法来近似计算π的值。以下是使 ...
{:9_241:}这是什么原理 这个是数学问题,数学里有很多公式,比如说Π/4=1-1/3+1/5-1/7…… 陈尚涵 发表于 2023-7-30 12:42
这个是数学问题,数学里有很多公式,比如说Π/4=1-1/3+1/5-1/7……
试过了,但是效率太低{:10_266:} MoChengShi 发表于 2023-7-30 12:43
试过了,但是效率太低
也没有比数学公式更快的方法了,模拟比这个慢,你可以尝试用c/c++这样的效率高的语言,还是不行那可以升级电脑配置 陈尚涵 发表于 2023-7-30 12:45
也没有比数学公式更快的方法了,模拟比这个慢,你可以尝试用c/c++这样的效率高的语言,还是不行那可以升 ...
作业要求10秒求出pi的前n位,不给打表,不给借助库,n<=100啊{:10_266:} MoChengShi 发表于 2023-7-30 12:53
作业要求10秒求出pi的前n位,不给打表,不给借助库,n
???这要求离谱了,计算可没这么容易啊,能不能提前存好? 陈尚涵 发表于 2023-7-30 12:55
???这要求离谱了,计算可没这么容易啊,能不能提前存好?
55555不行{:10_266:} MoChengShi 发表于 2023-7-30 12:59
55555不行
那我也没招了{:10_245:}{:10_328:} 陈尚涵 发表于 2023-7-30 13:02
那我也没招了
{:10_250:}作业完不成了 MoChengShi 发表于 2023-7-30 13:06
作业完不成了
拿去{:10_256:}
3.1415926535897932384626433832795028841971693993751058209749445
我看了一下,Python Decimal 模块都费劲,在 15 位的时候就出问题了,所以,如果你不想手写小数高精度,那么这道题无解。 MoChengShi 发表于 2023-7-30 12:40
这是什么原理
我这个原理类似于随机落点,简单说就是画一个正方形,里面有一个圆,随机落点看看落在圆里面的概率
更简单的是这种方法:
from mpmath import mp
# 调用函数并打印出π的前100位
mp.dps = 101
print(mp.pi)
Python的话很简单,C++不太会,你可以参考ChatGPT的写法。 陈尚涵 发表于 2023-7-30 13:02
那我也没招了
小数高精度,虽然可能会有亿点点麻烦{:10_256:} MoChengShi 发表于 2023-7-30 12:53
作业要求10秒求出pi的前n位,不给打表,不给借助库,n
谁能知道你是打表,现在的题目基本上都是黑箱评测,根本不看你过程的{:10_256:} zhangjinxuan 发表于 2023-7-30 13:20
谁能知道你是打表,现在的题目基本上都是黑箱评测,根本不看你过程的
u1s1,我一开始也是这么想的,但是如果老师看代码呢? zhangjinxuan 发表于 2023-7-30 13:19
小数高精度,虽然可能会有亿点点麻烦
这是包含1/3这样的无限循环小数的,所以这难度绿题起步 zhangjinxuan 发表于 2023-7-30 13:19
小数高精度,虽然可能会有亿点点麻烦
还要处理小数点位数
页:
[1]
2