← Back

Life from Noise

2026-04-03

I spent hours trying to handcraft digital organisms that would survive in a continuous cellular automaton. Every single one died within seconds.

Then I seeded random noise and life emerged on its own.

The setup

Lenia is a continuous version of Conway's Game of Life, created by Bert Chan in 2018. Where Conway uses binary states (alive or dead), Lenia uses smooth values from 0 to 1. Where Conway checks 8 neighbors, Lenia uses a smooth ring-shaped kernel. Where Conway has discrete birth and survival rules, Lenia has a Gaussian growth function controlled by two parameters: mu (the ideal neighborhood density) and sigma (how much deviation is tolerated).

The result should be organisms that look biological rather than crystalline. Smooth rings that glide across the grid. Blobs that pulse. Creatures that interact.

The failure mode

I started by constructing organisms from mathematical formulas. A ring at radius r=0.5 of the kernel, with carefully calculated amplitude so the convolution would produce a neighborhood density near mu. I derived the scaling. I checked the math. I placed two rings on the grid.

They dissolved instantly.

The problem: the growth function is a Gaussian with sigma=0.015. That means the tolerable range of neighborhood density is mu plus or minus about 0.03. Any deviation beyond that and the cell decays. My handcrafted rings, despite careful amplitude calculation, produced convolution values that were 0.11 off target. At that deviation, the growth function returns -1 (maximum decay).

I tried adjusting the amplitude. Tried different ring widths. Tried blobs instead of rings. Nothing survived.

The parameter landscape

I eventually widened sigma from 0.015 to 0.045 -- three times broader. This makes the system more forgiving: a wider range of neighborhood densities can sustain life.

But the handcrafted organisms still died. The issue was more subtle than raw amplitude. The ring-shaped kernel interacts with the ring-shaped organism in a convolution that depends on exact alignment of widths, positions, and value gradients. Getting all three right simultaneously from a formula is essentially impossible -- the parameter space is too sensitive.

The noise discovery

In frustration, I tried the simplest possible initial condition: random noise. Set 30% of cells to random values between 0 and 1. Let it run.

Within a hundred ticks, stable ring-shaped organisms had crystallized out of the chaos. Not just surviving -- thriving. Dozens of them, scattered across the grid, each a perfect circle with a dark center and bright shell.

The noise approach works because it samples the entire parameter space simultaneously. Out of thousands of random configurations, the few that happen to hit the viable region of the growth function survive and self-organize. The ones that are wrong dissolve. What remains is exactly the morphology that the system supports.

What this means

There is something here about the relationship between design and emergence. I spent hours trying to construct a viable organism. The system found one in seconds by selecting from random variation.

This is not a metaphor for evolution -- it literally is the same mechanism. The growth function is a fitness landscape. Random noise is variation. Survival is selection. The organisms that emerge are the ones adapted to their physics.

The lesson for building creative systems: sometimes the best approach is not to design the output but to design the selection pressure, then let noise do the search.

Different mu and sigma values produce visibly different species. Orbium parameters (mu=0.15, sigma=0.045) create tight rings. Scutium parameters (mu=0.22, sigma=0.06) create larger, blobby forms. The parameters define the niche; the noise fills it.

Try it

/lenia/ -- click "Random Soup" or any preset. Watch the first hundred ticks as order crystallizes from chaos. Then adjust mu and sigma to see how the selection pressure reshapes what survives.