Re: Random Normal deviates within compiled function?
- To: mathgroup at smc.vnet.net
- Subject: [mg62655] Re: Random Normal deviates within compiled function?
- From: "Ray Koopman" <koopman at sfu.ca>
- Date: Wed, 30 Nov 2005 00:07:33 -0500 (EST)
- Organization: http://groups.google.com
- References: <dln17e$gf4$1@smc.vnet.net><dmh9fg$8ul$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Lee Newman wrote:
> I use the following two functions. The first generates a single value
> from a normal distribution with mean and stdev specified in the
> arguments. It avoids the use of Mathematica's built in distribution
> functions. It will generate 10^6 values (using Table or Do) with
> timing of about 4 seconds on my machine (2.8GHz P4 with 1GB RAM). The
> second function is really fast. It uses the built-in NormalDistribution
> function, and for some reason using RandomArray makes it quite fast. It
> generates an array of 10^6 values in about 0.5seconds on my machine.
>
>
> GaussianNoise = Compile[{{mean, _Real}, {stdev, _Real}},
> Module[{r = 0.0, x = 0.0, y = 0.0},
> While[r == 0.0 || r > 1,
> x = Random[Real, {-1, 1}];
> y = Random[Real, {-1, 1}];
> r = x*x + y*y;
> ];
> (x*Sqrt[-2Log[r]/r])*stdev + mean
> ]
> ];
>
> GaussianArray =
> RandomArray[NormalDistribution[#1, #2], #3] &;
> (* the first argument is mean, second is the stdev and the third
> specifies the length of the array. *)
>
> Cheers,
> Lee Newman
See my June 16, 2003, post "Warning -- another Random[] failure".
Substituting your GaussianNoise[0,1] for Random[] in my code, and
using n1 = n2 = 7, reps = 10^6, gives a residual vector z = {-3.41982,
-4.12281, -.859585, -1.25571, -1.20193, -1.36457, .863248, -1.0381,
.884148, 1.54233, 2.8457, 2.28917, 2.75297, 2.75567, 2.65074, 2.31981,
1.50249, 2.49637, -.324406, -.211185, -3.19893, -2.32533, -1.65605,
-3.64346, -2.50297, -2.5255, -1.12445, -1.9046, -.786623, .151306,
-.844143, -.570679, .6032, 1.3326, 1.1453, 1.50075, 1.76664,
3.94393, 3.67223, 1.75058, 2.30061, 1.93212, -1.00784, -.53217,
-1.49742, .0818344, -.308665, -3.80073, -3.30265, -4.65006},
chisqr = 240.303, df = 49, p = 4.8*^-27. The plot is far from random.