MoChengShi 发表于 2023-7-30 12:34:45

如何用Python或C++求PI?不借助模块?

rt{:9_241:}

要用代码实现

isdkz 发表于 2023-7-30 12:34:59

要用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之间的随机点,并计算落入单位圆内的点的数量,最后根据比例得出π的估算值。

请注意,蒙特卡洛方法是一种估算方法,估算值的精度受样本数量的影响,样本数量越大,估算值越接近真实值π。同时,蒙特卡洛方法在计算π时相对简单,但不如其他算法在效率上高效。

陶远航 发表于 2023-7-30 12:35:02

要用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++)的值可以提高估计的准确性。
如果问题已经解决,请设置最佳答案

MoChengShi 发表于 2023-7-30 12:38:59

isdkz 发表于 2023-7-30 12:34
要用Python或C++来求π,可以使用著名的蒙特卡洛方法。蒙特卡洛方法是一种基于概率的数值计算技术,通过随 ...

python代码无法运行{:10_277:}

MoChengShi 发表于 2023-7-30 12:40:05

陶远航 发表于 2023-7-30 12:35
要用Python或C++求π(PI),不依赖于现有的模块,可以使用著名的蒙特卡洛方法来近似计算π的值。以下是使 ...

{:9_241:}这是什么原理

陈尚涵 发表于 2023-7-30 12:42:31

这个是数学问题,数学里有很多公式,比如说Π/4=1-1/3+1/5-1/7……

MoChengShi 发表于 2023-7-30 12:43:51

陈尚涵 发表于 2023-7-30 12:42
这个是数学问题,数学里有很多公式,比如说Π/4=1-1/3+1/5-1/7……

试过了,但是效率太低{:10_266:}

陈尚涵 发表于 2023-7-30 12:45:46

MoChengShi 发表于 2023-7-30 12:43
试过了,但是效率太低

也没有比数学公式更快的方法了,模拟比这个慢,你可以尝试用c/c++这样的效率高的语言,还是不行那可以升级电脑配置

MoChengShi 发表于 2023-7-30 12:53:14

陈尚涵 发表于 2023-7-30 12:45
也没有比数学公式更快的方法了,模拟比这个慢,你可以尝试用c/c++这样的效率高的语言,还是不行那可以升 ...

作业要求10秒求出pi的前n位,不给打表,不给借助库,n<=100啊{:10_266:}

陈尚涵 发表于 2023-7-30 12:55:52

MoChengShi 发表于 2023-7-30 12:53
作业要求10秒求出pi的前n位,不给打表,不给借助库,n

???这要求离谱了,计算可没这么容易啊,能不能提前存好?

MoChengShi 发表于 2023-7-30 12:59:07

陈尚涵 发表于 2023-7-30 12:55
???这要求离谱了,计算可没这么容易啊,能不能提前存好?

55555不行{:10_266:}

陈尚涵 发表于 2023-7-30 13:02:48

MoChengShi 发表于 2023-7-30 12:59
55555不行

那我也没招了{:10_245:}{:10_328:}

MoChengShi 发表于 2023-7-30 13:06:14

陈尚涵 发表于 2023-7-30 13:02
那我也没招了

{:10_250:}作业完不成了

zhangjinxuan 发表于 2023-7-30 13:18:30

MoChengShi 发表于 2023-7-30 13:06
作业完不成了

拿去{:10_256:}

3.1415926535897932384626433832795028841971693993751058209749445

我看了一下,Python Decimal 模块都费劲,在 15 位的时候就出问题了,所以,如果你不想手写小数高精度,那么这道题无解。

陶远航 发表于 2023-7-30 13:18:54

MoChengShi 发表于 2023-7-30 12:40
这是什么原理

我这个原理类似于随机落点,简单说就是画一个正方形,里面有一个圆,随机落点看看落在圆里面的概率

更简单的是这种方法:

from mpmath import mp

# 调用函数并打印出π的前100位
mp.dps = 101
print(mp.pi)


Python的话很简单,C++不太会,你可以参考ChatGPT的写法。

zhangjinxuan 发表于 2023-7-30 13:19:33

陈尚涵 发表于 2023-7-30 13:02
那我也没招了

小数高精度,虽然可能会有亿点点麻烦{:10_256:}

zhangjinxuan 发表于 2023-7-30 13:20:41

MoChengShi 发表于 2023-7-30 12:53
作业要求10秒求出pi的前n位,不给打表,不给借助库,n

谁能知道你是打表,现在的题目基本上都是黑箱评测,根本不看你过程的{:10_256:}

陈尚涵 发表于 2023-7-30 13:44:53

zhangjinxuan 发表于 2023-7-30 13:20
谁能知道你是打表,现在的题目基本上都是黑箱评测,根本不看你过程的

u1s1,我一开始也是这么想的,但是如果老师看代码呢?

陈尚涵 发表于 2023-7-30 13:45:45

zhangjinxuan 发表于 2023-7-30 13:19
小数高精度,虽然可能会有亿点点麻烦

这是包含1/3这样的无限循环小数的,所以这难度绿题起步

陈尚涵 发表于 2023-7-30 13:46:11

zhangjinxuan 发表于 2023-7-30 13:19
小数高精度,虽然可能会有亿点点麻烦

还要处理小数点位数
页: [1] 2
查看完整版本: 如何用Python或C++求PI?不借助模块?