使用Java中随机生成的数据计算pi的蒙特卡罗

时间:2016-08-13 03:49:09

标签: java random montecarlo pi

我正在开发一个程序,根据随机生成的浮点数计算pi,浮点数表示图上的x,y坐标。每个x,y坐标以2的幂提高并存储在两个单独的阵列中。坐标均匀分布在间隔为0,1的图表上。

程序会添加x,y坐标,如果它们小于1,则这些点位于直径为1的圆内,如下图所示。

enter image description here

然后我使用了公式

π≈4 w / n

计算出pi。其中, w 是圆内点的计数, n 是数组中x或y坐标的数量。

当我将n设置为10,000,000(数组的大小)时,它会生成最准确的小数位数为15-16的pi计算。然而,在将4GB的RAM专用于运行配置并将n设置为100,000,000 pi后,最终为0.6710 ...

我想知道为什么会发生这种情况?很抱歉,如果这是一个愚蠢的问题..代码如下。

import java.text.DecimalFormat;
import java.util.Random;

public class random_pi {

    public random_pi() {

        float x2_store[] = new float[10000000];
        float y2_store[] = new float[10000000];
        float w = 0;

        Random rand = new Random();
        DecimalFormat df2 = new DecimalFormat("#,###,###");

        for (int i = 0; i < x2_store.length; i++) {
            float x2 = (float) Math.pow(rand.nextFloat(), 2);
            x2_store[i] = x2;
            float y2 = (float) Math.pow(rand.nextFloat(), 2);
            y2_store[i] = y2;
        }

        for (int i = 0; i < x2_store.length; i++) {
            if (x2_store[i] + y2_store[i] < 1) {
                w++;
            }
        }

        System.out.println("w: "+w);
        float numerator = (4*w);
        System.out.printf("4*w: " + (numerator));
        System.out.println("\nn: " + df2.format(x2_store.length));
        float pi = numerator / x2_store.length;

        String fmt = String.format("%.20f", pi);
        System.out.println(fmt);

        String pi_string = Double.toString(Math.abs(pi));
        int intP = pi_string.indexOf('.');
        int decP = pi_string.length() - intP - 1;
        System.out.println("decimal places: " + decP);
    }

    public static void main(String[] args) {
        new random_pi();
    }
}

0 个答案:

没有答案