蒙特卡羅

用於 Monte Carlo Sim 的 Java 中的 Mersenne twister 隨機數生成器。

  • March 25, 2011

我在 Java 中使用 Mersenne twister 隨機數生成器進行蒙特卡羅模擬。我需要在 -1 和 1 之間均勻分佈值。我的程式碼如下(我正在導入org.apache.commons.math.random.MersenneTwister,這是一個包含我正在呼叫的方法的 Apache Commons 庫)。

for(int i = 0; i<= NumberOfTrials-1; i++ ) {  
   MersenneTwister mtsign = new MersenneTwister();  
   boolean sign = mtsign.nextBoolean();            // random true or false  
   MersenneTwister mt = new MersenneTwister();  
   if (sign=true){  
       random[i] = mt.nextDouble(); }  //i.e. (random number between 0 and 1)  
   else if (sign=false){  
       random[i] = - mt.nextDouble(); }   // i.e. random number beween -1 and 0   
}

random[]由於某種原因,結果數組 的每個索引都包含相同的值(並且所有索引都是正的,因為布爾值一直返回 true)。非常感謝任何想法/建議。

問題是您正在為每次迭代創建一個新的隨機數生成器。跳出new MersenneTwister()循環:

MersenneTwister mtsign = new MersenneTwister();
MersenneTwister mt = new MersenneTwister();
for(int i = 0; i<= NumberOfTrials-1; i++ ) {
 // use mtsign and mt here
 ...
}

此外,您不需要兩個生成器,您可以重新縮放:

MersenneTwister mt = new MersenneTwister();  
for(int i = 0; i<= NumberOfTrials-1; i++ ) {  
  random[i] = mt.nextDouble() * 2 - 1;
}

最後,在您的程式碼中,您可能需要將生成器推到呼叫樹的更深處,以避免重複生成相同的序列。

引用自:https://quant.stackexchange.com/questions/757