Boost logo

Boost :

From: Lapshin, Kirill (Kirill.Lapshin_at_[hidden])
Date: 2003-02-13 11:54:23


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_at_[hidden]]
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.

  

 



Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk