글 작성자: 개발자 올라프

Assignment

 

최소값(min), 최대값(max)을 받아 그 사이의 랜덤수를 return하는 함수를 구현하시오.

 

My code

 

function getRandomNumber(min, max) {
	retrun (Math.random()*(max-min))+min;
}

매우 짧은 코드이지만 풀지 못했던 문제로 정리해보려 한다.

 

난수생성

Math.random(); // 0 ~ 0.999999

우선 Math.random()은 0이상 1미만의 부동소숫점 의사 난수를 반환한다. 1을 포함하지 않는다는 점이 중요하다.

 

최대값 설정

// 0이상 최대값 미만의 난수 생성
Math.random() * 최대값 // 0 <= x < 최대값

Math.random()은 0이상 1미만의 난수를 반환한다고 했다. 양변에 최대값을 곱하면 (0*최대값 <= x < 1*최대값)으로 0이상 최대값 미만의 값을 생성할 수 있다. 예를들어 Math.random() * 10을 하면 0 <= x < 10 사이의 난수를 얻을 수 있다.

 

최소값 설정

// 최소값 이상 최대값+1 미만의 난수 생성
(Math.random() * 최대값) + 최소값 // 최소값 <= x < 최대값+최소값

Math.random()은 0이상의 난수를 생성하므로 곱셈을 하여도 최소값은 변하지 않는다. 이때 최소값으로 설정할 값을 양변에 더하면 된다(0+최소값 <= x < 1*최대값+최소값). 예를 들어 (Math.random() * 10) + 1을 하면 1 <= x < 11 사이의 난수를 얻을 수 있다.

 

여기서 문제가 발생하는데 최소값 이상 최대값 미만의 난수를 얻고 싶은데, 최대값으로 설정한 값이 최소값 만큼 증가한다는 점이다. 

 

최소값 설정으로 인한 문제 해결

(Math.random() * (최대값-최소값)) + 최소값 // 최소값 <= x < 최대값

최대값으로 설정한 값이 최소값만큼 커졌으니 난수에 최대값으로 곱할 값에서 최소값만큼 빼면 원하는 결과를 얻을 수 있다. 이제 정리된 예시를 통해서 이해해 보도록 하자.

 

예시 ) 1이상 10미만의 난수를 생성하고 싶다면?

(Math.random() * (10-1)) + 1​

우선 괄호 안의 식부터 풀이하면 Math.random() * 9로 0 <= x < 9 사이의 값을 가지는 난수를 얻을 수 있다.

이후, 1을 더하면 1 <= x < 10 사이의 값을 가지는 난수를 얻을 수 있다.