java - 使用蒙特卡罗方法计算 pi java - 计算不起作用

标签 java

我必须使用蒙特卡罗方法来计算圆周率。需要获取(-1,1)之间的xy坐标。然而,每次我运行该程序时,它都会给出 0 的答案。我不确定我做错了什么,有人可以帮忙吗?

package montecarlo;

import java.util.Scanner;

import java.io.PrintStream;

import java.util.Random;

public class MonteCarlo {

    public static void main(String[] args) throws Exception {

        Scanner keyboard = new Scanner(System.in);

        System.out.println("Please enter total number of dart throws");

        int nThrows = keyboard.nextInt();

        double PI= calculatePi(nThrows);

        PrintStream ps = new PrintStream("PiEstimate.txt");

        ps.printf("PI estimate = %.4f", PI);

    }

    public static boolean insideCircle (double x, double y)
    {
        double range = Math.sqrt((x * x) + (y * y));

        return (range < 1.0);
    }

    public static double calculatePi(int nThrows) 
    {

        int dartsInCircle = 0;
        double piEstimate;
        Random rGenerator = new Random();
        for (int i=0; i < nThrows; i++) {
          double x = rGenerator.nextDouble()*Math.pow(-1, rGenerator.nextInt());
          double y = rGenerator.nextDouble()*Math.pow(-1, rGenerator.nextInt());
          if (insideCircle(x,y))
          dartsInCircle++;
    } piEstimate=(4.0*(dartsInCircle/nThrows));
    return piEstimate;

} 
}

最佳答案

您在这里将 int 除以 int:(dartsInCircle/nThrows)

由于 dartsInCircle 始终小于 nThrows,因此整数除法将始终返回 0。您需要将其中一个操作数转换为双倍。

编辑:如果您使用足够好的 IDE(例如 IntelliJ),它应该会提示您“精度损失”警告或类似警告。

关于java - 使用蒙特卡罗方法计算 pi java - 计算不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46762938/

相关文章:

java - Python 和 Java 中正则表达式语法的差异

java - 从 Java 到 C++ JNI 获取字符串数组

java - 从用户定义的文件路径访问外部资源 (Java)

Java 应用程序使用 openCSV CSVReader 读取 csv 文件时出错... java.lang.ArrayIndexOutOfBoundsException

java - 保留 Guava SetMultimap 中的插入顺序

java - JTextField 要求我在进行正确更新之前再次给予它焦点

java - 从嵌套的 RecyclerView 中删除项目

java - 如何以编程方式在 SVG 文件中进行组转换?

java - 默认 java 构造函数

java - 布局完成后调用的方法?