JoshWComeau

random

Filed under
Snippets
on
in
May 17th, 2020.
May 2020.
const random = (min, max) => (
  Math.floor(Math.random() * (max - min)) + min
);

Link to this headingContext

In JavaScript, we can generate random numbers using the Math.random() function. Unfortunately, this function only generates floating-point numbers between 0 and 1.

In my experience, it's much more common to need a random integer within a certain range. For example, a random number between 10 and 20.

This little helper lets us do that!

Link to this headingUsage

// Get a random number out of [10, 11, 12, 13]
random(10, 14);

// Get a random number from 1 to 100 (inclusive)
random(1, 101);

// Get a random number from -10 to 10 (inclusive)
random(-10, 11);

Link to this headingExplanation

This function maps the 0..1 range generated by Math.random to a range you specify. If you haven't seen this practice before, it can be pretty wild looking!

Let's say we're going for a random number between 0 and 4. Because Math.random gives us a random number between 0 and 1, this is a relatively straightforward problem: we can multiply the result by 4, and round down to get the integer:

const MAX = 4;

// Get an initial random value.
// Between 0 and 0.999999 (inclusive)
const initialRandom = Math.random();

// Multiply it by our MAX, 4.
// Will be between 0 and 3.999999 (inclusive)
const multiplied = initialRandom * MAX;

// Round it down using Math.floor.
// Will be 0, 1, 2, or 3.
const answer = Math.floor(multiplied);

What if we want a minimum other than 0? What if we want a value between 1 and 4?

The trick is that we need to get the delta. 4 - 1 is 3, so we'll get a random value between 0 and 2.99999. We can then bump it up by our minimum value, to shift it into the right range:

const MIN = 1;
const MAX = 4;

// Figure out the delta, with subtraction
const DELTA = MAX - MIN;

// Get an initial random value.
// Between 0 and 0.999999 (inclusive)
const initialRandom = Math.random();

// Multiply it by our DELTA, 3.
// Will be between 0 and 2.999999 (inclusive)
const multiplied = initialRandom * DELTA;

// Round it down using Math.floor.
// Will be 0, 1, or 2.
const floored = Math.floor(multiplied);

// Our possible range is 1 short: we want either 1, 2, or 3!
// By adding 1, we shift it up to fit the range perfectly:
const answer = floored + MIN;

Our snippet does all of this work, rolled into a compact expression:

const random = (min, max) => (
  Math.floor(Math.random() * (max - min)) + min
);

This snippet, along with any other code on this page, is released to the public domain under the Creative Commons Zero (CC0) license(opens in new tab).

Last updated on

May 17th, 2020

# of hits