## RANDN Gaussian (Normal) Random Number Generator

Section: Random Number Generation

### Usage

Creates an array of pseudo-random numbers of the specified size. The numbers are normally distributed with zero mean and a unit standard deviation (i.e., `mu = 0, sigma = 1`). Two seperate syntaxes are possible. The first syntax specifies the array dimensions as a sequence of scalar dimensions:
```  y = randn(d1,d2,...,dn).
```

The resulting array has the given dimensions, and is filled with random numbers. The type of `y` is `double`, a 64-bit floating point array. To get arrays of other types, use the typecast functions. The second syntax specifies the array dimensions as a vector, where each element in the vector specifies a dimension length:

```  y = randn([d1,d2,...,dn]).
```

This syntax is more convenient for calling `randn` using a variable for the argument. Finally, `randn` supports two additional forms that allow you to manipulate the state of the random number generator. The first retrieves the state

```  y = randn('state')
```

which is a 625 length integer vector. The second form sets the state

```  randn('state',y)
```

or alternately, you can reset the random number generator with

```  randn('state',0)
```

### Function Internals

Recall that the probability density function (PDF) of a normal random variable is

The Gaussian random numbers are generated from pairs of uniform random numbers using a transformation technique.

### Example

The following example demonstrates an example of using the first form of the `randn` function.
```--> randn(2,2,2)

ans =

(:,:,1) =
-1.7375   -0.5664
-0.2634   -1.0112

(:,:,2) =
-0.4020    0.0557
-1.8966    0.2098
```

The second example demonstrates the second form of the `randn` function.

```--> randn([2,2,2])

ans =

(:,:,1) =
-0.7183    1.9415
0.1010   -1.1747

(:,:,2) =
0.3048    3.1685
-1.4185   -0.6130
```

In the next example, we create a large array of 10000 normally distributed pseudo-random numbers. We then shift the mean to 10, and the variance to 5. We then numerically calculate the mean and variance using `mean` and `var`, respectively.

```--> x = 10+sqrt(5)*randn(1,10000);
--> mean(x)

ans =
10.0135

--> var(x)

ans =
4.9458
```

Now, we use the state manipulation functions of `randn` to exactly reproduce a random sequence. Note that unlike using `seed`, we can exactly control where the random number generator starts by saving the state.

```--> randn('state',0)    % restores us to startup conditions
--> a = randn(1,3)      % random sequence 1

a =
-0.0362   -0.1404    0.6934

--> b = randn('state'); % capture the state vector
--> c = randn(1,3)      % random sequence 2

c =
0.5998    0.7086   -0.9394

--> randn('state',b);   % restart the random generator so...
--> c = randn(1,3)      % we get random sequence 2 again

c =
0.5998    0.7086   -0.9394
```