1018 TIL

기멜·2021년 10월 18일
0

자바스크립트 독학

목록 보기
36/44

Math와 random에 대해서 배워봅시다.
참조: 제로초 자바스크립트 강좌 유튜브

무작위로 숫자 뽑기

숫자를 뽑는 절차는 사실 여러 절차로 구성되어 있습니다. 먼저 네 개의 숫자를 저장할 자리를 마련해야 하고, 무작위로 숫자를 하나씩 뽑아 저장하는 절차를 네 번 반복해야 합니다. 여기서 중요한 것은 무작위로 뽑지만, 중복되지 않게 뽑아야 한다는 점입니다.

무작위 숫자를 만드는 함수는 Math.random( ) 입니다.
이 함수는 0 이상 1 미만의 수를 무작위로 생성합니다. 숫자 야구 게임에서는 1에서 9까지의 숫자가 필요합니다. 따라서 Math.random( )에 9를 곱한 후 1을 더하면 됩니다. 그러면 1이상 10 미만의 수가 만들어지는데 이 수는 자연수가 아니라서 아직 쓸 수 없습니다. (뒤에 소수가 붙어있음) 숫자를 자연수로 만들려면 내림, 올림, 반올림을 해야 합니다. 이 경우에는 내림을 합니다. 결과로부터 1 부터 9까지의 자연수가 나옵니다. 자바스크립트에서 숫자의 내림은 Math.floor( )로 할 수 있습니다. 참고로 올림은 Math.ceil( ), 반올림은 Math.round( )입니다.

무작위 숫자 뽑는 과정

무작위숫자를 뽑는방법
Math.random( )0 < = x < 1
Math.random( ) * 9< = x < 9
Math.random( ) * 9 + 11 < = x < 10
Math.floor(Math.random( ) * 9 + 1 )x = {1, 2, 3, 4, 5, 6, 7, 8, 9}

수학적으로 적어보자면
0 < = Math.random < 1 는 0 이상 1 미만으로 나오고
여기에 9를 곱하면 0 < = Math.random * 9 < 9 (소수점에 숫자를 곱하면 아무리 9를 넣었다고 해도 앞자리가 9가 나오지 않는다. 8.999~ 이렇게가 제일 크게 나온다. 잘 모르겠으면 계산기를 두들겨보아라) (추가설명을 하자면 *9 라고 설정하면 자동으로 9미만이라고 설정 된다. 그래서 Math.random * 9는 8.랜덤소수점 이렇게가 제일 큰 숫자가 된다. 수학적으로 그렇게 되게 되어있다.) 그런데 우리는 1부터 9까지가 나오기를 바라는 거니까
0 < = Math.random * 9 + 1 < 10 이렇게 하면 1부터 10 미만의 숫자가 랜덤으로 만들어 집니다.
최종적으로는 Math.floor(Marh.random() * 9 + 1) 이런식을 쓰면 랜덤으로 정수가 나옵니다.

자, 이제 숫자 네 개를 랜덤으로 뽑아보겠습니다.

const numbers = [];
for (let n = 0; n < 9; n += 1) {
  numbers.push(n);
}

const answer = [];
for (let n = 0; n <=3; n += 1) { // 네 번 반복
  const index = Math.floor(Math.random() * 9); // 0~8 정수
  answer.push(numbers[index]);
  numbers.splice(index, 1);
}
console.log(answer);

[ ] 를 쓰는 이유 배열을 쓸 지 { }를 쓸 지도 골라야 하는데 어떤 기준으로 판단하냐면 배열을 쓸 지 객체를 쓸 지 , 배열은 단순히 값들을 모아놓을 때 쓰면 되고, 각각의 값이 이름을 붙여야할 때 속성이름을 붙여서 값을 구분해야할 때는 객체 리터럴을 쓰면 됩니다.

answer.push(numbers[index]);
numbers.splice(index, 1);

뽑은 거는 push해주고 splice로 그 뽑은 값을 제거해주고 이거를 이제 4번 반복하게 됩니다.
그런데 저 식에서 잘 못된 점은 배열에서 숫자를 하나씩 뽑아가서 숫자는 점점 줄어드는데 const index = Math.floor(Math.random() * 9) 에서는 계속 0~8을 뽑고 있다는 겁니다. 그래서 빈 곳을 뽑아내서 undefined가 나온다는 것입니다.

간단한 방법은 이 방법이 있습니다.

const answer = [];
for (let n = 0; n <=3; n += 1) { // 네 번 반복
  const index = Math.floor(Math.random() * numbers.length); // 0~8 정수
  answer.push(numbers[index]);
  numbers.splice(index, 1);
}
console.log(answer);

(numbers.length) 이렇게 해줘서 반복문이 한번 돌 때숫자가 빠지니까 알아서 줄어듭니다. 그러면 더이상 undefined는 나오지 않습니다.

Math.sqrt( )란?
숫자의 제곱근을 반환합니다.
제곱근이란 제곱했을 때 그 수가 되는 수를 의미합니다.
Math.PI( )란?
속성은 원의 둘레와 지름의 비율 약, 약 3.14159의 값을 가집니다.

profile
프론트엔드 개발자를 꿈꾸는 도화지 위를 달리는 여자

0개의 댓글