鱼C论坛

 找回密码
 立即注册
查看: 1519|回复: 32

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

[复制链接]
发表于 2023-7-30 12:34:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
rt

要用代码实现
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

请注意,蒙特卡洛方法是一种估算方法,估算值的精度受样本数量的影响,样本数量越大,估算值越接近真实值π。同时,蒙特卡洛方法在计算π时相对简单,但不如其他算法在效率上高效。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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++)的值可以提高估计的准确性。
如果问题已经解决,请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

python代码无法运行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

这是什么原理
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-30 12:42:31 | 显示全部楼层
这个是数学问题,数学里有很多公式,比如说Π/4=1-1/3+1/5-1/7……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-30 12:43:51 | 显示全部楼层
陈尚涵 发表于 2023-7-30 12:42
这个是数学问题,数学里有很多公式,比如说Π/4=1-1/3+1/5-1/7……


试过了,但是效率太低
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-30 12:45:46 | 显示全部楼层
MoChengShi 发表于 2023-7-30 12:43
试过了,但是效率太低

也没有比数学公式更快的方法了,模拟比这个慢,你可以尝试用c/c++这样的效率高的语言,还是不行那可以升级电脑配置
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

作业要求10秒求出pi的前n位,不给打表,不给借助库,n<=100啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-30 12:55:52 | 显示全部楼层
MoChengShi 发表于 2023-7-30 12:53
作业要求10秒求出pi的前n位,不给打表,不给借助库,n

???这要求离谱了,计算可没这么容易啊,能不能提前存好?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-30 12:59:07 | 显示全部楼层
陈尚涵 发表于 2023-7-30 12:55
???这要求离谱了,计算可没这么容易啊,能不能提前存好?

55555不行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-30 13:02:48 | 显示全部楼层

那我也没招了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-7-30 13:06:14 | 显示全部楼层

作业完不成了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-30 13:18:30 | 显示全部楼层


拿去

3.1415926535897932384626433832795028841971693993751058209749445

我看了一下,Python Decimal 模块都费劲,在 15 位的时候就出问题了,所以,如果你不想手写小数高精度,那么这道题无解。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-30 13:18:54 | 显示全部楼层


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

更简单的是这种方法:
from mpmath import mp

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

Python的话很简单,C++不太会,你可以参考ChatGPT的写法。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-30 13:19:33 | 显示全部楼层

小数高精度,虽然可能会有亿点点麻烦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-30 13:20:41 | 显示全部楼层
MoChengShi 发表于 2023-7-30 12:53
作业要求10秒求出pi的前n位,不给打表,不给借助库,n


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

点评

看我的回复  发表于 2023-7-30 15:02
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

u1s1,我一开始也是这么想的,但是如果老师看代码呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-30 13:45:45 | 显示全部楼层
zhangjinxuan 发表于 2023-7-30 13:19
小数高精度,虽然可能会有亿点点麻烦

这是包含1/3这样的无限循环小数的,所以这难度绿题起步
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-30 13:46:11 | 显示全部楼层
zhangjinxuan 发表于 2023-7-30 13:19
小数高精度,虽然可能会有亿点点麻烦

还要处理小数点位数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-7 11:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表