On 07/07/2012 07:23 PM, Burton Samograd wrote:
On 12-07-07 07:03 PM, Kevin Reid wrote:
On Jul 7, 2012, at 17:44, Burton Samograd wrote:

Here is the definition of normal, which has no divisions:

(defun normal (&optional (a 1.0) (s 0.5))
  (+ a (* (sqrt (* -2 (log (random 1.0)))) (cos (* 2 pi (random 1.0))) s)))

Any idea where this division by zero error might be coming from?
RANDOM may return 0.0 in which case LOG will (on SBCL) signal DIVISION-BY-ZERO.

Ah, I had a feeling it was something like that but the division by zero 
was throwing me off.

Thanks. I got that line from Rosetta Code; maybe it should be fixed.  
What is a good fix for this? I'm thinking that adding a very small value 
to the result of random might suffice but I don't like it.

--
Burton Samograd

Adding a small amount would warp the distribution (a tiny amount). But this will work and won't:

(defun normal (&optional (a 1.0) (s 0.5))
  (+ a (* (sqrt (* -2 (log (- 1.0 (random 1.0))))) (cos (* 2 pi (random 1.0)))
  s)))

According to the spec, random produces numbers always less than the limit so it will never hit zero. And its a uniform distribution so you haven't changed its statistical properties.

Jeff Cunningham