Re: excessive LogNormalDistribution timing
- To: mathgroup at yoda.physics.unc.edu
 - Subject: Re: excessive LogNormalDistribution timing
 - From: withoff
 - Date: Mon, 5 Oct 92 10:35:04 CDT
 
> Dear Mathgroupers,
> 
>   We need to draw random numbers from some of the continuous distributions
> provided in the package Statistics`ContinuousDistributions` in Mma 2.0, but
> we discovered a gross disparity in the timing for the LogNormalDistribution
> which makes it almost impossible to use for real applications.  Here is an
> example (on a MacIIfx):
> 
> ran1=Table[Random[ExponentialDistribution[1]], {100} ]//Timing
> 
>   {1.  Second,...}
> 
> ran2=Table[Random[NormalDistribution[0,1]], {100} ]//Timing
> 
>   {1.61667  Second,...}
> 
> ran3=Table[Random[LogNormalDistribution[0,1]], {100} ]//Timing
> 
>   {110.7  Second,...}
> 
> There is a factor of 50-100 disparity.  Yet LogNormalDistribution only
> involves one extra Log evaluation compared to ExponentialDistribution or
> NormalDistribution.  What can possibly be wrong here?
> 
> -------------------------------------------
> Dr. Warren J. Wiscombe
> NASA Goddard, Code 913, Greenbelt, MD 20771
> (301) 286-8499
The formula in Statistics`ContinuousDistributions` for random
numbers with a LogNormalDistribution computes quantiles of
uniformly distributed random numbers, while the formula for
random numbers with a NormalDistribution uses a much faster
formula.  The faster formula can be used for both distributions.
In[4]:= Do[Random[LogNormalDistribution[0, 1]], {100}] //Timing
Out[4]= {60.9333 Second, Null} 
In[13]:= LogNormalDistribution/: Random[LogNormalDistribution[mu_, sigma_]] := 
            Exp[mu + sigma Sqrt[-2 Log[Random[]]] Cos[2Pi Random[]]] 
         
In[14]:= Do[Random[LogNormalDistribution[0, 1]], {100}] //Timing 
Out[14]= {0.566667 Second, Null}
In many cases a number of other things can be done for further speed
improvements, (use low-precision formulas for quantiles, generate numbers
in pairs, etc.), but I am not an expert on the subject.  Perhaps someone
who is could help out.