java中pi_使用Java中随机生成的数据进行pi的Monte Carlo计算

我正在开发一个程序,该程序根据表示图表上x,y坐标的随机生成的浮点数来计算pi.每个x,y坐标乘以2的幂,然后存储在两个单独的数组中.坐标均匀地分布在间隔为0.1的图形上.

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

8cb051622bb915e9858bc690b0c589fd.png

然后我用公式

π≈4 w / n

制定圆周率.其中,w是圆内点的计数,n是数组内x或y坐标的数量.

当我将n设置为最大10,000,000(数组的大小)时,它将生成最精确的pi(15-16位小数位)计算.但是,在将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();

}

}

解决方法:

问题在这里:

float w = 0;

float numerator = (4*w);

浮点精度不够,请将其更改为int或double:

像这样的工作示例代码:

import java.text.DecimalFormat;

import java.util.Random;

public class random_pi {

public random_pi() {

float x2_store[] = new float[100000000];

float y2_store[] = new float[100000000];

int 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);

int numerator = (4*w);

System.out.printf("4*w: " (numerator));

System.out.println("\nn: " df2.format(x2_store.length));

float pi = ((float)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();

}

}

输出:

w: 78544041

4*w: 314176164

n: 100,000,000

3.14176154136657700000

decimal places: 15

而且您不需要存储结果,例如以下工作示例代码:

import java.text.DecimalFormat;

import java.util.Random;

public class pi {

public pi() {

double n=100000000;

double w = 0;

Random rand = new Random();

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

for (int i = 0; i < n; i ) {

double x = rand.nextFloat();

double y = rand.nextFloat();

if ((x*x y*y) < 1.0) w ;

}

System.out.println("w: " w);//w: 7852372.0

double numerator = (4*w);

System.out.printf("4*w: " (numerator));//4*w: 3.1409488E7

System.out.println("\nn: " df2.format(n));//n: 10,000,000

double pi = numerator / n;

final String fmt = String.format("%.20f", pi);

System.out.println(fmt);//3.14094877243042000000

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);//decimal places: 14

}

public static void main(String[] args) {

new random_pi();

}

}

输出:

w: 78539606

4*w: 314158424

n: 100,000,000

3.14158439636230470000

decimal places: 16

来源:https://www.icode9.com/content-1-562351.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值