개발 지식 - JavaScript에서 무작위 정수 만들기

이유승·2024년 11월 27일
0

개발 지식

목록 보기
29/29
post-thumbnail
  • 우선, JavaScript에는 무작위 정수를 직접 생성하는 내장 메서드가 따로 존재하지 않는다.

Math.random()?

  • 이 녀석은 0에서 1 사이의 소수점을 포함한 값 하나를 무작위 생성해줄 뿐이다.

  • JavaScript는 이 녀석을 이용해서 여러 범위와 유형의 숫자를 생성하도록 설계되어있다.

JavaScript의 무작위 정수 생성하기

Math.floor(Math.random() * (max - min + 1)) + min;

  • 이 것이 JavaScript에서 무작위 정수 하나를 생성하는 공식이다.

  • 이 공식이 어떻게 무작위 정수 하나를 생성하는지, 순차적으로 알아보자.



Math.random()의 동작 이해

  • Math.random()은 0 ~ 1 범위의 값을 반환한다.
    - 0.00000..1에서 0.999999..의 값 중 하나를 생성한다는 뜻. 0.12345, 0.98765, 0.54321 등등...



* (max - min + 1)

  • (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()으로 생성된 1 미만의 소수에 숫자 간격을 곱셈한다.
  • 이로써 결과는 0부터 (max - min + 1)의 결과값 사이의 값으로 계산된다.
Math.random() 값계산식결과 (Math.random() * 6)
0.00.0 * 60.0
0.10.1 * 60.6
0.250.25 * 61.5
0.50.5 * 63.0
0.750.75 * 64.5
0.9999…0.9999… * 65.9999…



Math.floor

  • 이전까지의 연산 결과로, 소수점 이상의 숫자가 생겼다.

  • 그렇다면 이번에는 필요가 없어진 소수점 이하 숫자를 제거해주기만 하면 된다.

  • Math.floor()는 인자로 정수값을 제공해주지 않으면 모든 소수점을 제거해준다.
    (정수값을 넣어주면, 그 자리수 이하의 소수점만을 남기고 나머지를 제거한다.)

Math.random() 값계산식결과 (Math.floor)
0.0Math.floor(0.0)0
0.1Math.floor(0.6)0
0.25Math.floor(1.5)1
0.5Math.floor(3.0)3
0.75Math.floor(4.5)4
0.9999…Math.floor(5.9999…)5



+ min

  • 그런데 정수 생성의 조건이었던, 최솟값 5 / 최대값 10은 아직 반영되지 않았다.

  • 결국 0부터 5 사이의 숫자만 반환되기 때문.

  • 따라서 값을 일정 범위만큼 이동시켜주면 된다. 최솟값을 한번 더 사용해서 값을 이동시켜주면 된다.

Math.floor 결과+ min (5) 추가최종 결과
00 + 55
11 + 56
22 + 57
33 + 58
44 + 59
55 + 510



무작위 정수 생성

Math.floor(Math.random() * (max - min + 1)) + min;

  • 위와 같은 과정을 거쳐 위 공식은 사용자가 기입한 min에서 max사이의 정수 하나를 생성하게 된다.



아니면 라이브러리를 쓰자..

  • 사실 복잡한 공식을 사용할 필요는 없다. 무작위 정수 생성을 더 간단히 처리할 수 있는 라이브러리가 많기 때문.

Lodash

const _ = require('lodash');

console.log(_.random(1, 10)); // 1 ~ 10 사이의 정수

Chance.js:

const Chance = require('chance');
const chance = new Chance();

console.log(chance.integer({ min: 1, max: 10 })); // 1 ~ 10 사이의 정수
profile
프론트엔드 개발자를 준비하고 있습니다.

0개의 댓글