Skip to main content

Random values

Randomly generated values can be used to create a sense of variety and unpredictability in your animation. In Motion Canvas, it's achieved using the useRandom() function. It returns a random number generator (RNG) for the current scene:

import {useRandom} from '@motion-canvas/core';

const random = useRandom();
const integer = random.nextInt(0, 10);

In this case, calling nextInt() will return an integer in the range from 0 to 10 (exclusive). Check the Random api to see all available methods.

Unlike Math.random(), useRandom() is completely reproducible - each time the animation is played the generated values will be exactly the same. The seed used to generate these numbers is stored in the meta file of each scene.

You can also provide your own seed to find a sequence of numbers that best suits your needs:

const random = useRandom(123);

The animation at the top of this page uses a random number generator to vary the height of rectangles and make them look like a sound-wave:

import {Layout, Rect, makeScene2D} from '@motion-canvas/2d';
import {
all,
loop,
makeRef,
range,
sequence,
useRandom,
} from '@motion-canvas/core';

export default makeScene2D(function* (view) {
const random = useRandom();
const rects: Rect[] = [];

view.add(
<Layout layout gap={10} alignItems="center">
{range(40).map(i => (
<Rect
ref={makeRef(rects, i)}
radius={5}
width={10}
height={10}
fill={'#e13238'}
/>
))}
</Layout>,
);

yield* loop(3, () =>
sequence(
0.04,
...rects.map(rect =>
all(
rect.size.y(random.nextInt(100, 200), 0.5).to(10, 0.5),
rect.fill('#e6a700', 0.5).to('#e13238', 0.5),
),
),
),
);
});