자바스크립트 두 정수 사이의 랜덤 정수 뽑아내기

두 정수 a와 b가 있다고 가정할 때
a = 5, b = 13
a에서 b사이의 랜덤한 정수를 뽑아내려면
Math.random을 어떤식으로 구성해야 할까요?

Math.floor(Math.random() ... )

… 부분을 어떤식으로 작성하면 5에서 13사이의 정수를 뽑아낼까요?

수학문제지요

Math.random() = x

0 <= x <= 1

5, 13 → 0, 8

0 <= 8 * x <= 8

5 <= 8 * x + 5 <= 13

답변 감사드립니다. 알려주신대로 Math.random()을 x로 가정하고 5와 13을 이용해서 부등식을 코드로 작성해봤습니다. 5를 최솟값인 low 13을 최댓값인 high 배열 길이를 나타내는 length에 7을 대입한 코드입니다.

function random(low, high, length) {
    let arr = [];
    let x = Math.random();
    for (let i = 0; i < length; i++) {
        num = Math.floor(low <= high * x + low <= high);
        arr.push(num);
    }

    return arr;
}

console.log(random(5, 13, 7));

순서의 잘못인지 어떠한 문제 때문에 콘솔에는 배열의 길이가 7인

[
  1, 1, 1, 1,
  1, 1, 1
]

이 출력이 됩니다. 어느 점이 문제일까요?

우선 Math.random을 반복문 아래 한 번 내려보신 후 생각해 보시는게 좋을 것 같케요

좋아요 1
    let x = Math.random();
    for (let i = 0; i < length; i++) {
      num = Math.floor(low <= high * x + low <= high);
      arr.push(num);
    }

이렇게 하면 x에는 무작위 소수 하나 정해지고 계속 재사용되죠. x는 Math.random을 한 번 호출됐을 때에 나온 난수 소수가 저장됐을 뿐이니까요. 호출할 때마다 새로운 무작위 난수를 만들고 싶다면 Math.random을 계속 호출해야 합니다.

for (let i = 0; i < length; i++) {
let num = Math.floor(low <= high * Math.random() + low <= high);
arr.push(num);
}

아뇨 두분다 let x = Math.random()을 반복문 아래로 내려보시라 했는데 제가

for (let i = 0; i < length; i++) {
        let num = Math.floor(low <= high * Math.random() + low <= high);
        arr.push(num);
    }

을 시도해보고도 안되어서 let x = Math.random()을 반복문에서 빼놓은겁니다.

코드 다시 보니 당연히 안 되겠네요 ㅋㅋ

Math.floor(low <= high * Math.random() + low <= high)

boolean을 한 것은 당연히 0 아니면 1밖에 될 수가 없습니다

for (let i = 0; i < length; i++) {
  let num = Math.floor(high * Math.random() + low);
  // 또는 let num = Math.floor(Math.random()) * high + low;
  // low, high가 정수라면 수학적으로 동일함
  arr.push(num);
}

답변 감사합니다. 부등식을 사용해서 불리언값을 리턴하므로 1(true)가 찍힌거였네요. 그런데 답변대로 작성하면 분명 최댓값 high이 13인데 13을 초과한 숫자가 배열에 들어있습니다. 최솟값 미만으로는 배열에 없지만 최댓값 초과로는 배열에 존재하게 되네요

앗 다른 언어에서 나머지 연산으로 랜덤 값 구하던 버릇 때문에 아무런 생각 없이 곱셈으로 처리해 버렸네요.

상한값이 high라면 low와의 차를 구해서 구해야겠지요
Math.floor(Math.random()) * (high - low) + low

좋아요 1

감사합니다! 덕분에 해결하였습니다

좋아요 2