**TL;DR**

`function generateRandomInteger(min, max) { return Math.floor(min + Math.random()*(max + 1 - min)) } `

To get the random number `generateRandomInteger(-20, 20);`

**EXPLANATION BELOW**

We need to get a random integer, say **X** between min and max.

Right?

i.e **min <= X <= max**

If we subtract min from the equation, this is equivalent to

**0 <= (X - min) <= (max - min)**

Now, lets multiply this with a random number **r** which is

**0 <= (X - min) * r <= (max - min) * r**

Now, lets add back **min** to the equation

**min <= min + (X - min) * r <= min + (max - min) * r**

Now, lets chose a function which results in **r** such that it satisfies our equation range as [min,max]. This is only possible if **0<= r <=1**

OK. Now, the range of **r** i.e [0,1] is very similar to Math.random() function result. Isn't it?

The Math.random() function returns a floating-point, pseudo-random number in the range [0, 1); that is, from 0 (inclusive) up to but not including 1 (exclusive)

For example,

# Case r = 0

`min`

+ 0 * (`max`

-`min`

) = **min**

# Case r = 1

`min`

+ 1 * (`max`

-`min`

) = **max**

# Random Case using Math.random 0 <= r < 1

`min`

+ r * (`max`

-`min`

) = **X**, where **X** has range of **min** <= **X** < **max**

The above result **X** is a random numeric. However due to Math.random() our left bound is inclusive, and the right bound is exclusive. To include our right bound we increase the right bound by 1 and floor the result.

`function generateRandomInteger(min, max) { return Math.floor(min + Math.random()*(max + 1 - min)) } `

# To get the random number

`generateRandomInteger(-20, 20)`

;