Suppose you create a large matrix *M* by filling its components with random values. If *M *has size *n* by *n*, then we require the probability distribution for each entry to have mean 0 and variance 1/*n*. Then the Girko-Ginibri circular law says that the eigenvalues of *M* are approximately uniformly distributed in the unit disk in the complex plane. As the size *n* increases, the distribution converges to a uniform distribution on the unit disk.

The probability distribution need not be normal. It can be any distribution, shifted to have mean 0 and scaled to have variance 1/*n*, provided the tail of the distribution isn’t so thick that the variance doesn’t exist. If you don’t scale the variance to 1/*n* you still get a circle, just not a *unit* circle.

We’ll illustrate the circular law with a uniform distribution. The uniform distribution has mean 1/2 and variance 1/12, so we will subtract 1/2 and multiply each entry by √(12/*n*).

Here’s our Python code:

import matplotlib.pyplot as plt import numpy as np n = 100 M = np.random.random((n,n)) - 0.5 M *= (12/n)**0.5 w = np.linalg.eigvals(M) plt.scatter(np.real(w), np.imag(w)) plt.axes().set_aspect(1) plt.show()

When *n*=100 we get the following plot.

When *n*=1000 we can see the disk filling in more.

Note that the points are symmetric about the real axis. All the entries of *M* are real, so its characteristic polynomial has all real coefficients, and so its roots come in conjugate pairs. If we randomly generated complex entries for *M* we would not have such symmetry.

**Related post**: Fat-tailed random matrices