如何从Gaussian(0,1)改进Java模拟代码

如何从Gaussian(0,1)改进Java模拟代码,java,simulation,gaussian,inversion,Java,Simulation,Gaussian,Inversion,我对java真的很陌生,我已经创建了一个代码,通过反演方法模拟100000个来自高斯分布的观测值,平均值=0,标准偏差=1。与R中的rnorm命令或Python中的numpy.random命令相比,代码的速度较慢,好吧,我知道我在代码中使用了很多for循环,但是for循环不是R和Python命令用于随机模拟的核心吗?无论如何,这是我的代码,如果你对我如何改进它有任何建议,请分享(类名是“HelloWorld”,因为我昨天从java开始打印“HelloWorld”消息) 我的代码: import

我对java真的很陌生,我已经创建了一个代码,通过反演方法模拟100000个来自高斯分布的观测值,平均值=0,标准偏差=1。与R中的rnorm命令或Python中的numpy.random命令相比,代码的速度较慢,好吧,我知道我在代码中使用了很多for循环,但是for循环不是R和Python命令用于随机模拟的核心吗?无论如何,这是我的代码,如果你对我如何改进它有任何建议,请分享(类名是“HelloWorld”,因为我昨天从java开始打印“HelloWorld”消息)

我的代码:

import java.io.*;
import java.util.Scanner;
import java.util.concurrent.ThreadLocalRandom;

public class HelloWorld {

public static void main(String[] args) 
{
    double randomNum=0.0;
    for(int i=0;i<99999;i++) {
      //technically generating from uniform (0,1)
      randomNum=ThreadLocalRandom.current().nextDouble(0, 1); 
      System.out.println(nr(0,randomNum));}
}



public static double gaussian01(double x){ 
    //defining the gaussian (0,1)
     double par=(Math.sqrt(2*Math.PI));
     double ar=(Math.exp(-(x*x)/2));
     return ar/par;}

public static double integx2(double upper){  
// defining the integration for the gaussian function
      double lower=-9;
      double step= 0.001;
      int ran=(int)((upper-lower)/step);
      double[] xs=new double[ran+1];
      xs[0]=lower;
      for(int i=1; i<=ran;i++) xs[i]=xs[i-1]+step;
      double[] gin= new double[ran+1];
      for(int i=0; i<=ran;i++) gin[i]=step*(gaussian01(xs[i]));
      double sum=0;
      for(int i=0; i<=ran;i++) sum=sum+gin[i];
      return sum;}   


public static double fun(double upper1,double u){ 
//defining the equation which's solution follows the gaussian (0,1) if 'u' is taken from Uniform(0,1) 
      return integx2(upper1)-u;}


public static double grad(double x0, double uu){ 
  // computing the first derivative for the newton-raphson
   return (fun(x0+0.01,uu)-fun(x0,uu))/0.01;}

public static double nr(double str, double uuu1){ 
    // solving the equation above with the newton raphson method
     double x1=str-fun(str,uuu1)/grad(str,uuu1);
     double dif=x1-str;
     while(Math.abs(dif)>=0.001){
            str=x1;
            x1=str-fun(str,uuu1)/grad(str,uuu1);
            dif=x1-str;}
     return x1;}


}
import java.io.*;
导入java.util.Scanner;
导入java.util.concurrent.ThreadLocalRandom;
公共类HelloWorld{
公共静态void main(字符串[]args)
{
双随机数=0.0;

对于(int i=0;iyes我知道marsaglia polar方法,但是我想尝试反转方法,是的,我非常确定应该存在用于此目的的标准类,只是想自己尝试一下,并且想知道代码在性能方面是否良好如果您询问性能,为什么不进行测量它?提示:这很可怕。但这与你的Java技能无关,这是你选择的算法的结果。好吧,因此,除非我的代码中有一些真正浪费的东西,否则反转方法是不可能像我猜想的那样工作的。但是正如你提到的那样,是算法本身导致了缓慢的性能,谢谢你的帮助。看起来是的,我知道marsaglia polar方法,但是我想尝试反转方法,是的,我非常确定应该有用于此目的的标准类,只是想自己尝试一下,如果您询问性能,我想知道代码在性能方面是否良好ce,你为什么不测量一下呢?提示:这很可怕。但这与你的Java技能无关,这是你选择的算法的结果。好吧,所以反转方法不可能像我猜想的那样工作,除非我的代码中有一些非常浪费的东西。但是正如你提到的那样,是算法本身导致了性能低下,那就是谢谢你的帮助。看起来这更适合你。