Java 随机省道程序

Java 随机省道程序,java,Java,我在Cay Horstmann的书中遇到了这个问题: 对以下模拟进行编程:省道在随机点上投射到 方形,带角(1,1)和(−1.−1). 如果省道落在单位圆内(即, 圆心(0,0)和半径为1的圆,它是一个命中。否则,这是一次失误。运行这个 模拟并使用它来确定π的近似值。如果你需要额外的学分 解释为什么这是一种比布冯针更好的估算π的方法 节目 我确实明白为什么这是一个比布冯针更好的估算π的方法 程序,所以这很好。但我的代码似乎有问题 这是我目前的代码: import java.util.Scanne

我在Cay Horstmann的书中遇到了这个问题:

对以下模拟进行编程:省道在随机点上投射到 方形,带角(1,1)和(−1.−1). 如果省道落在单位圆内(即, 圆心(0,0)和半径为1的圆,它是一个命中。否则,这是一次失误。运行这个 模拟并使用它来确定π的近似值。如果你需要额外的学分 解释为什么这是一种比布冯针更好的估算π的方法 节目

我确实明白为什么这是一个比布冯针更好的估算π的方法 程序,所以这很好。但我的代码似乎有问题

这是我目前的代码:

import java.util.Scanner;

public class Dart {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.println("Enter number of tries: ");
        int n = in.nextInt();
        int miss = 0;
        int hit = 0;
        double x = Math.random() * 2 - 1;
        double y = Math.random() * 2 - 1;
        double func = x * x + y * y;
        for (int i = 0; i < n; i++) {
            if (func <= 1) {
                hit++;
            } else {
                miss++;
            }
        }
        System.out.println("Probability: " + hit / (hit + miss) * 4);
    }
}
import java.util.Scanner;
公共级飞镖{
公共静态void main(字符串[]args){
扫描仪输入=新扫描仪(系统输入);
System.out.println(“输入尝试次数:”);
int n=in.nextInt();
int未命中=0;
int hit=0;
double x=Math.random()*2-1;
double y=Math.random()*2-1;
双函数=x*x+y*y;
对于(int i=0;i如果(func当您分配一个变量时,该变量不会在每次请求时重新计算——它只分配一次,直到重新分配为止,它始终是相同的值。因此:

double x=Math.random()*2-1;
double y=Math.random()*2-1;
双函数=x*x+y*y;
将x和y设置为-1和1之间的随机数,将func设置为
x*x+y*y
…然后它们将保持这种方式,直到程序结束,因为您从未重新分配它们

因此:

for(int i=0;i
import java.util.Scanner;

public class Dart
{
    public static void main(String[]args)
    {
        Scanner in = new Scanner(System.in);

        System.out.println("Enter number of tries: ");
        int n = in.nextInt();

        double miss = 0;
        double hit = 0;

        double x = 0, y = 0, func = 0;

        for (int i = 0; i < n; i++)
        {
            x = Math.random() * 2 - 1;
            y = Math.random() * 2 - 1;

            func = x * x + y * y;

            if (func <= 1)
                hit++;
            else
                miss++;
        }

        System.out.println("Probability: " + ( (double) hit / (hit + miss) * 4 ));
    }
}
import java.util.Scanner;
公共级飞镖
{
公共静态void main(字符串[]args)
{
扫描仪输入=新扫描仪(系统输入);
System.out.println(“输入尝试次数:”);
int n=in.nextInt();
双脱靶率=0;
双击=0;
双x=0,y=0,func=0;
对于(int i=0;i如果(func)您刚刚偶然发现整数除法。请稍等,我会为您找到一个链接。除了整数除法问题,您还只生成一次尝试,然后计算n次,因为您只调用
Math.random()
一次代表x,一次代表y,但你应该在循环内部调用它。因为整数除法不是唯一的问题,我收回了我的投票。谢谢!所有这些都很有帮助。“你需要使用双倍或浮点数来表示命中和未命中”呃,不是真的。从语义上讲,它们应该是整数,因为它们正在计数(谨慎的数量)有些东西。最好在需要的时候施展。@FedericoklezCulloca是的,当然这是一个更好的方法,但在某些时候你需要使用DoubleAssure!只是不像你那样:)效果很好!我很高兴:)