mouse@mcgill-vision.UUCP (der Mouse) (03/10/88)
In article <2629@haddock.ISC.COM>, karl@haddock.ISC.COM (Karl Heuer) writes: > Followups to sci.math; this has nothing to do with C anymore. I'm redirecting them to comp.misc, because this has nothing to do with C specifically, but what I have to say is about computing results rather than the mathematical aspects of the question. >> [Approximating a Gaussian generator by adding 12 numbers in [0,1) >> and subtracting 6] > I happen to prefer the polar-coordinate version, because it's > mathematically exact, Of course, the probability of getting one of the values out in the tail of the proper Gaussian distribution is only one in several thousand. But I suppose if you're generating hundreds of thousands of them.... > requires only one call to the uniform RNG per result, As far as I can see, this affects only esthetics and possibly speed > and is faster (or so I've been told). I just ran a quick comparison. The uniform RNG was obtained by writing an assembly-language wrapper for 4.3BSD random(), the wrapper getting a float out of random() by dropping the random bits into the mantissa of a floating-point number and scaling to [0,1). The machine on which this was done is a VAX-11/750. Both Gaussian generators were hand-coded in assembly. The polar method was straight out of Knuth; the add-twelve-numbers was improvised on the spot (it was only about six instructions). I find that the polar method is about a factor of three faster. The measurements I got were 1079.84 calls/sec for the polar method (34220 calls took 3169 clock ticks of 1/100 second each) and 342.264 calls/sec for the twelve-number method (9070 calls in 2650 ticks). Of course, this was done on a multi-user system, but I did run it at nice -10, and made sure time taken to page things in didn't affect things much. If I really cared, I'd run it standalone. der Mouse uucp: mouse@mcgill-vision.uucp arpa: mouse@larry.mcrcim.mcgill.edu