Sure.

In NR they propose to do pretty much what you are doing, but they made one step further to avoid sin/cos calls.

Here is the code from NR:

 

if (iset == 0) { //We don't have an extra deviate handy, so

    do {

            v1=2.0*ran1(idum)-1.0; //pick two uniform numbers in the square extending

                               //from -1 to +1 in each direction, v2=2.0*ran1(idum)-1.0;

            rsq=v1*v1+v2*v2;       // see if they are in the unit circle,

    } while (rsq >= 1.0 || rsq == 0.0); //and if they are not, try again.

    fac=sqrt(-2.0*log(rsq)/rsq);

 

    //Now make the Box-Muller transformation to get two normal deviates. Return one and

    //save the other for next time.

    gset=v1*fac;

    iset=1; //Set flag.

    return v2*fac;

} else {            //We have an extra deviate handy,

    iset=0;         //so unset the flag,

    return gset;    //and return it.

}

 

As I mentioned before switching to this schema improved performance of my app by 20%.

App is doing monte-carlo simulation, it spends majority of the time generating normally distributed random numbers, but does some other calculation as well, so performance improvement is even bigger.

 

-----Original Message-----
From: Matthias Troyer [mailto:troyer@itp.phys.ethz.ch]
Sent:
Thursday, February 13, 2003 12:27 AM

Can you elaborate as to what the difference between Box-Muller and the implemented method is? As far as I understand Box-Muller it is just the implemented algorithm.