2016-03-01 86 views
0

在我的方法找到Y = X^4下方的區域中的結構域2≤X≤4,我將使用與座標(2,0)(4,0)(2, 256)(4, 256)一個假設矩形。我將在這個矩形內生成隨機的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); 

    } 
} 
+1

@RC。 4億是好的,40億不是。 –

+0

誤讀,我的壞 – 2016-03-01 13:42:29

回答

4

randomNum = MIN + rand.nextDouble((最大 - 最小)+ 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. 
} 
+0

非常感謝!不過,我的答案似乎仍然非常不準確。雖然正確的答案是198.4,我的估計大約是302.我的邏輯中是否有任何錯誤需要修正? – Abhinav

+0

@Abhinav我看不到你在代碼中調用這個方法的地方。我建議你使用它。 –

+0

哦,我早些時候評論過。感謝您指出了這一點。我的估計現在是198.3的方法!再次感謝! – Abhinav

0

由於您在有界區間進行此操作,因此通常可以通過使用函數平均高度的蒙特卡羅採樣來獲得較低的區域方差估計值。平均高度乘以基地的面積。僞代碼:

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) 
+0

這是一個有趣的方法來處理它。我會嘗試一下。謝謝! – Abhinav