Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在域2≤中查找y=x^4下面的区域;x&x2264;4使用蒙特卡罗方法_Java_Random_Montecarlo - Fatal编程技术网

Java 在域2≤中查找y=x^4下面的区域;x&x2264;4使用蒙特卡罗方法

Java 在域2≤中查找y=x^4下面的区域;x&x2264;4使用蒙特卡罗方法,java,random,montecarlo,Java,Random,Montecarlo,在我的方法中,我将使用一个坐标为(2,0)、(4,0)、(2256)和(4256)的假设矩形。我将在这个矩形内生成随机xy坐标,并找出y定义的区域内坐标数之间的比率≤ x^4和整个矩形内的坐标数。用这个乘以矩形的面积,就可以得到图形下的面积 我正在努力在定义的矩形中生成随机十进制xy坐标。任何帮助都将不胜感激:) 我刚刚开始融入学校,所以到目前为止,我在这方面的知识还很有限 这是我的密码: public class IntegralOfX2 { public static double

在我的方法中,我将使用一个坐标为
(2,0)
(4,0)
(2256)
(4256)
的假设矩形。我将在这个矩形内生成随机xy坐标,并找出
y定义的区域内坐标数之间的比率≤ x^4
和整个矩形内的坐标数。用这个乘以矩形的面积,就可以得到图形下的面积

我正在努力在定义的矩形中生成随机十进制xy坐标。任何帮助都将不胜感激:)

我刚刚开始融入学校,所以到目前为止,我在这方面的知识还很有限

这是我的密码:

public class IntegralOfX2 {

    public static double randDouble(double min, double max) {
        min = 2;
        max = 4;
        Random rand = new Random();
           double randomNum;
        randomNum = min + rand.nextDouble((max - min) + 1); // an error keeps occuring here

        return randomNum;
    }



    public static void main(String[] args) {

        double x = 0; // x co-ordinate of dart
        double y = 0; // y co-ordinate of dart
        int total_darts = 0; // the total number of darts
        int success_darts = 0; // the number of successful darts
        double xmax = 4;
        double xmin = 2;
        double ymax = 256;
        double ymin = 0;
        double area = 0;


        for (int i = 0; i < 400000000; i++) {
         //   x = randDouble(xmin, xmax);
         //   y = randDouble(ymin, ymax);


          x = xmin + (Math.random() * ((xmax - xmin) + 1));
          y = ymin + (Math.random() * ((ymax - ymin) + 1));

                    total_darts++;


            if (y <= (x * x * x * x)) {
                success_darts++;
            }

        }


       double ratio = (double)success_darts/(double)total_darts;
       area = ratio * 512;
       System.out.println(area);

    }
}
公共类整数{
公共静态双随机双(双最小值,双最大值){
最小值=2;
最大值=4;
Random rand=新的Random();
双随机数;
randomNum=min+rand.nextDouble((max-min)+1);//这里一直发生错误
返回随机数;
}
公共静态void main(字符串[]args){
双x=0;//省道的x坐标
双y=0;//省道的y坐标
int total_darts=0;//省道总数
int success_darts=0;//成功的省道数
双xmax=4;
双xmin=2;
双ymax=256;
双ymin=0;
双面积=0;
对于(int i=0;i<400000000;i++){
//x=随机双精度(xmin,xmax);
//y=randDouble(ymin,ymax);
x=xmin+(Math.random()*((xmax-xmin)+1));
y=ymin+(Math.random()*((ymax-ymin)+1));
总镖数++;
如果(y)
randomNum=min+rand.nextDouble((max-min)+1);//这里一直发生错误

这是一个错误,因为不存在这样的方法。您可能需要

public static double randDouble(double min, double max) {
    return min + Math.random() * (max - min + Math.ulp(max));
}
您可以删除Math.ulp,但它最接近于为随机整数添加1

对于大量样本,可以使用均匀分布,例如

int samples = 100000;
double spacing = (max - min) / spacing;
for (int i = 0; i < samples; i++) {
    double x = min + (i + 0.5) * spacing;
    // use x as an input.
}
int样本=100000;
双间距=(最大-最小)/间距;
对于(int i=0;i
randomNum=min+rand.nextDouble((max-min)+1);//这里一直发生错误

这是一个错误,因为不存在这样的方法。您可能需要

public static double randDouble(double min, double max) {
    return min + Math.random() * (max - min + Math.ulp(max));
}
您可以删除Math.ulp,但它最接近于为随机整数添加1

对于大量样本,可以使用均匀分布,例如

int samples = 100000;
double spacing = (max - min) / spacing;
for (int i = 0; i < samples; i++) {
    double x = min + (i + 0.5) * spacing;
    // use x as an input.
}
int样本=100000;
双间距=(最大-最小)/间距;
对于(int i=0;i
由于您是在有界区间上进行此操作,因此通常可以通过对函数的平均高度进行蒙特卡罗采样来获得面积的较低方差估计。平均高度乘以基数即为面积。在伪代码中:

def f(x) {
    return x**4
}

range_min = 2
range_max = 4
range = range_max - range_min
sample_size = 100000
sum = 0
loop sample_size times {
    sum += f(range_min + range * U) // where U is a Uniform(0,1) random number
}
estimated_area = range * (sum / sample_size)

由于这是在有界区间上进行的,因此通常可以通过对函数的平均高度进行蒙特卡罗采样来获得面积的较低方差估计。平均高度乘以基数就是面积。在伪代码中:

def f(x) {
    return x**4
}

range_min = 2
range_max = 4
range = range_max - range_min
sample_size = 100000
sum = 0
loop sample_size times {
    sum += f(range_min + range * U) // where U is a Uniform(0,1) random number
}
estimated_area = range * (sum / sample_size)

@4亿卢比可以,40亿卢比不可以。@4亿卢比可以,40亿卢比不可以。非常感谢!但是,我的答案似乎仍然非常不准确。虽然正确的答案是198.4,但我的估计大约是302。我的逻辑中是否有任何错误需要修正?@Abhinav我看不出您在代码中调用此方法的地方。我建议y你使用它。哦,是的,我早些时候注释了它。谢谢你指出这一点。我的估计现在是198.3!再次感谢!@Abhinav问题很可能是额外的
+1
,它只适用于整数范围。这是必要的,因为你得到的值略小于上限,对于双精度,这意味着~1 In 1e16错误(太小,无法察觉)但是对于一个整数来说,这意味着你永远不会得到最大值。是的,这是有意义的。非常感谢!但是,我的答案似乎仍然非常不准确。虽然正确的答案是198.4,但我的估计大约是302。我的逻辑中有任何错误需要修正吗?@Abhinav我看不出你在你的cod中调用这个方法的地方e、 我建议你使用它。哦,是的,我之前已经注释掉了。谢谢你指出这一点。我现在用这个方法估计的值是198.3!再次感谢!@Abhinav问题很可能是额外的
+1
,它只适用于整数范围。这是必要的,因为你得到的值略小于上限,对于这个双倍表示1e16中的~1错误(太小以至于无法注意到),但对于整数,这意味着您永远无法获得最大值。是的,这很有意义。这是一种有趣的方法。我将尝试它。谢谢!这是一种有趣的方法。我将尝试它。谢谢!