우리가 자바스크립트를 사용할 때
랜덤한 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
이라는 수식이 있을 때,