왜 랜덤 정수를 만들때 Math.floor를 쓸까?

정현우·2020년 3월 27일
0

우리가 자바스크립트를 사용할 때
랜덤한 0~9 사이의 정수를 만드는 방법에 대해 검색을 하면 가장 많이 보는 소스는 이것입니다.

Math.floor(Math.random()*10);

소수점을 없애는 방법은 크게 3가지가 있는데
왜 모두들 하나 같이 Math.floor를 쓸까요?

내림 : Math.floor
올림 : Math.ceil
반올림 : Math.round

이것을 확인해 보기 위해 세가지 방법을 사용했을 경우 각각의 숫자가 나오는 확률을 구해보겠습니다.

검증용 소스

const result = {
	floor: [],
	ceil: [],
	round: []
}
let Max = 100000000; // 1억번
for(let i = 0 ; i<Max; i++){
	const rand = Math.random()*10;
	const f = Math.floor(rand);
	const c = Math.ceil(rand);
	const r = Math.round(rand);

	result.floor[f] = result.floor[f]+1 || 1;
	result.ceil[c] = result.ceil[c]+1 || 1;
	result.round[r] = result.round[r]+1 || 1;
}

Object.keys(result).forEach( item=>{
	let data = result[item];
	for(let i = 0 ; i < data.length ; i++){
		data[i] = data[i]/Max * 100 +"%";
	}
});
console.log(result);

아래 사진은 위 소스에 대한 결과값 입니다.

결과 값을 보면
floor와 ceil은 각각의 숫자에 대해 10%씩 거의 균등하게 나온 것을 알 수 있습니다.

하지만 round의 경우 0 ~ 10까지의 숫자가 나오고,
처음과 마지막 수의 확률이 5%씩 더 낮게 나옵니다.
이 이유는


0이 나오는 값: 0 ~ 0.4999
1가 나오는 값: 0.5 ~ 1.4999
2이 나오는 값: 1.5 ~ 2.4999
...
8이 나오는 값: 7.5 ~ 8.4999
9가 나오는 값: 8.5 ~ 9.4999
10이 나오는 값: 9.5 ~ 9.999


처음과 마지막 숫자의 범위가 더 적은 것을 알 수 있습니다.

결론

Math.random * N

이라는 수식이 있을 때,

  • Math.floor0 ~ N-1 의 랜덤한 정수가 나온다.
  • Math.ceil1 ~ N 의 랜덤한 정수가 나온다.
  • Math.round를 사용할 경우 처음과 마지막 수가 나올 확률이 적어진다.
profile
초보 개발자입니다.

0개의 댓글