3 votos

Generador de números aleatorios Mersenne twister en Java para Monte Carlo Sim.

Estoy utilizando el generador de números aleatorios Mersenne twister en Java para una simulación Monte Carlo. Necesito una distribución uniforme de valores entre -1 y 1. Mi código es el siguiente (estoy importando org.apache.commons.math.random.MersenneTwister que es una biblioteca de Apache Commons que contiene los métodos que estoy llamando).

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   
}

Cada índice de la matriz resultante, random[] contiene el mismo valor por alguna razón (y todos son positivos ya que el booleano sigue devolviendo true). Cualquier idea/consejo es muy apreciado.

7voto

DLRdave Puntos 398

El problema es que estás creando un nuevo generador de números aleatorios para cada iteración. Mover new MersenneTwister() fuera del bucle:

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

Además, no necesitas dos generadores, puedes simplemente reescalar:

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

Por último, en su código, es posible que tenga que empujar el generador aún más arriba en el árbol de llamadas para evitar generar la misma secuencia repetidamente.

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X