이 녀석은 0에서 1 사이의 소수점을 포함한 값 하나를 무작위 생성해줄 뿐이다.
JavaScript는 이 녀석을 이용해서 여러 범위와 유형의 숫자를 생성하도록 설계되어있다.
Math.floor(Math.random() * (max - min + 1)) + min;
이 것이 JavaScript에서 무작위 정수 하나를 생성하는 공식이다.
이 공식이 어떻게 무작위 정수 하나를 생성하는지, 순차적으로 알아보자.
(max - min + 1)은 숫자 간격을 계산하는 공식.
무작위 숫자를 생성할 때 사용할 최솟값과 최대값을 기준으로 넣을 때 필요하다.
왜 숫자 1이 더해지는 것인가?
- 가령 최솟값 5 / 최대값 10을 넣었다고 가정해보자.
- 생성되야 하는 숫자의 범위는 5, 6, 7, 8, 9, 10의 6개.
- 최솟값 4 / 최대값 10일 때에도 4, 5, 6, 7, 8, 9, 10의 7개 숫자가 범위로 잡혀져야 한다.
- 따라서 max - min 값에서 1을 항상 더해주도록 해야한다.
(max - min + 1)을 Math.random() 결과값에 곱하는 이유는?
Math.random() 값 | 계산식 | 결과 (Math.random() * 6) |
---|---|---|
0.0 | 0.0 * 6 | 0.0 |
0.1 | 0.1 * 6 | 0.6 |
0.25 | 0.25 * 6 | 1.5 |
0.5 | 0.5 * 6 | 3.0 |
0.75 | 0.75 * 6 | 4.5 |
0.9999… | 0.9999… * 6 | 5.9999… |
이전까지의 연산 결과로, 소수점 이상의 숫자가 생겼다.
그렇다면 이번에는 필요가 없어진 소수점 이하 숫자를 제거해주기만 하면 된다.
Math.floor()는 인자로 정수값을 제공해주지 않으면 모든 소수점을 제거해준다.
(정수값을 넣어주면, 그 자리수 이하의 소수점만을 남기고 나머지를 제거한다.)
Math.random() 값 | 계산식 | 결과 (Math.floor) |
---|---|---|
0.0 | Math.floor(0.0) | 0 |
0.1 | Math.floor(0.6) | 0 |
0.25 | Math.floor(1.5) | 1 |
0.5 | Math.floor(3.0) | 3 |
0.75 | Math.floor(4.5) | 4 |
0.9999… | Math.floor(5.9999…) | 5 |
그런데 정수 생성의 조건이었던, 최솟값 5 / 최대값 10은 아직 반영되지 않았다.
결국 0부터 5 사이의 숫자만 반환되기 때문.
따라서 값을 일정 범위만큼 이동시켜주면 된다. 최솟값을 한번 더 사용해서 값을 이동시켜주면 된다.
Math.floor 결과 | + min (5) 추가 | 최종 결과 |
---|---|---|
0 | 0 + 5 | 5 |
1 | 1 + 5 | 6 |
2 | 2 + 5 | 7 |
3 | 3 + 5 | 8 |
4 | 4 + 5 | 9 |
5 | 5 + 5 | 10 |
Math.floor(Math.random() * (max - min + 1)) + min;
const _ = require('lodash');
console.log(_.random(1, 10)); // 1 ~ 10 사이의 정수
const Chance = require('chance');
const chance = new Chance();
console.log(chance.integer({ min: 1, max: 10 })); // 1 ~ 10 사이의 정수