Re: Random Normal deviates within compiled function?
- To: mathgroup at smc.vnet.net
- Subject: [mg62302] Re: Random Normal deviates within compiled function?
- From: John Doty <jpd at whispertel.LoseTheH.net>
- Date: Sat, 19 Nov 2005 23:18:29 -0500 (EST)
- References: <dln17e$gf4$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Gareth Russell wrote:
> Hi All,
>
> I have a function which needs to be quick as it's used in simulations,
> and it requires the internal generation of a large vector of random
> normal deviates (up to 50,000). It appears that a function like
> Random[NormalDistribution[0,s]] cannot be compiled. Can anyone suggest
> an algorithm for getting such numbers that would work within a Compile
> statement and still be quicker than using the non-compiled function?
>
> The non-compiled function would look as follows:
>
> f[v_,r_,k_,s_,q_]:=Select[v*Exp[r*(1 - v/k) +
> RandomArray[NormalDistribution[0, s],
> Length[v]]], # > q &]
>
> where v is a vector of 50,000 reals, and r, k, s and q are scalar reals.
>
> (If anyone is interested, this is for population projection in
> population viability analysis.)
>
> Thanks,
>
> Gareth Russell
> NJIT
>
I've been using the following:
fastNoise = Compile[{}, 2.(Random[] + Random[] + Random[] - 1.5)];
It makes variates with mean 0, variance 1, with a roughly normal
distribution (for your problem multiply by s to adjust the variance).
Whether this is accurate enough depends on the problem: its main defect
is that its PDF falls to 0 outside the range [-3,3], so it won't
generate the rare extreme values in the normal distribution. Whether
this is a problem depends on what you're trying to calculate.
-jpd