일반적으로 난수를 발생시켜야 하는 경우 Math.random() 함수를 사용하여 구현을 하는 경우가 많다. Math.random은 0 ~ 1 사이의 난수를 무작위로 생성을 한다. 오늘 다룰 주제는 무작위로 생성된 난수의 범위를 지정해주는 것이다. 흔히 최소값과 최대값을 지정해서 그 사이를 범위로 갖게 만든다.
Math.random외에 알아두어야 할 것이 Math.floor()다. Math.floor()는 발생된 난수의 소수점을 없애고 정수를 추출하는데 사용된다.
범위를 정하는 방법의 순서이다.
1. Math.random의 최대값을 지정한다.
2. Math.random의 최소값을 지정한다.
3. 최소값 지정시의 문제점을 해소한다.
순서로 작성을 해놓았지만 최대값과 최소값은 동시에 지정되어야 범위가 정해진다.
1. Math.random의 최대값을 지정한다.
Math.random이 발생시킨 0 ~ 1 사이의 수에서 최대값을 지정해주려면 Math.random에 *(곱하기) 최대값을 해주면 된다.
Math.random() * 최대값
최대값을 6으로 정하고 싶다면 Math.random() * 6이며
발생되는 난수이 범위는 0 ~ 6 사이가 된다. 여기서 최대값을 6이라고 하였지만 6은 포함되지 않는다.
정확히는 0 초과 6 미만이 범위로 지정되는 것이다.
2. Math.random의 최소값을 지정한다.
최소값을 지정할 경우에는 약간의 머리를 써야 한다. 예시를 들어서 생각해 보자.
늘 상 기준은 0 ~ 1이다. 범위가 1 ~ 10 사이인 경우를 생각해 보자.
Math.random() + 1 을 해주면 1 ~ 2 사이가 된다.
여기에 우리는 최대값을 10으로 해주고 싶다. 그렇다면 + 1을 먼저 해주어서는 방법이 없다.
3. 최소값 지정시의 문제점을 해소한다.
최대값 부터 먼저 정해주고 최소값을 정해져 보자.
Math.random() * 10 ==> 0 ~ 10
(Math.random() * 10) + 1 ==> 1 ~ 11 ( 11에서 1을 빼주어야 한다.)
(Math.random() * (10 - 1)) + 1 ==> 최대값이 10이어야 하는데 11이되어서 1을 빼주었다.
Math.random() * 9를 해서 0 ~ 9 사이로 만들어주고
(Math.random() * 9) + 1을 해서 1 ~ 10 사이로 범위가 정해지게 되었다.
(Math.random() * (최대값 - 최소값)) + 최소값
더해주거나 곱해주는 경우 최대값과 최소값에 동시에 적용되기 때문에 원하는 범위를 지정하기 위해 최대값과 최소값을 동시에 지정해서 계산해야 하는 이유를 위의 사례를 통해 알 수 있다.
여기까지 해서 1 ~ 10 사이의 난수를 발생시켰다.
3.14534235234
Math.floor 사용하여 소수점을 삭제해 보자.
난수를 발생시켜 리턴값을 정수로만 하고 싶은 경우 Math.floor() 함수를 사용한다. floor 함수는 주어진 숫자와 같거나 더 작은 정수중에서 가장 큰 값을 반영한다. 그렇기 때문에 Math.floor(3.14534235234) = 3을 추출한다.
양의 정수에서는 신경쓸게 없으나 음수는 주의를 조금 해야한다. Math.floor(-3.14534235234) = -4 이다. 왜냐하면 floor의 정의가 같거나 더 작은 정수 중에서 가장 큰 값이기 때문이다.
Math.floor((Math.random() * (최대값 - 최소값)) + 최소값)
결론적으로 우리는 위와 같은 식을 통해 최소 최대값의 범위안에서 정수 형태의 난수를 생성시킬 수 있다.