Thanks very, very much to Michael, Mark and Mark. (I hope I didn't miss anybody.)

This is an excellent start. I think I can take it from here.

Cheers,


Tim Miller


On Oct 22, 2008, at 6:46 PM, Mark Smith wrote:

Timothy, the only way I could find of doing what you want is called 'the polar form of the Box-Muller transformation'.

Fortunately, it's not as bad as it sounds. :)

I've copied an ADA implementation, and here it is:

function polarBoxMuller pLength, pMean, pSdev
   put false into useLast
   repeat pLength

      repeat
put ((random(101) - 1) * 0.02) - 1 into x1 -- generate a random number between -1 and +1
         put ((random(101) - 1) * 0.02) - 1 into x2

         put (x1 * x1) + (x2 * x2) into w
         if w <= 1 then exit repeat
      end repeat

      if w <> 0 then put ln(w) * -2 into w -- rev barfs if w is zero
      if w <> 0 then put sqrt(w) / w into w -- ditto

      put x1 * w into y1
      put x2 * w into y2

      put pMean + y1 * pSdev & comma after tList
      put pMean + y2 * pSdev & comma after tList
   end repeat

   return char 1 to -2 of tList
end polarBoxMuller

This should give you a comma delimited list of (fairly) normally distributed numbers.

Best,

Mark

ps. I enjoy this sort of thing, so thanks for the question!


_______________________________________________
use-revolution mailing list
[email protected]
Please visit this url to subscribe, unsubscribe and manage your subscription 
preferences:
http://lists.runrev.com/mailman/listinfo/use-revolution

Reply via email to