두 정수 a와 b가 있다고 가정할 때
a = 5, b = 13
a에서 b사이의 랜덤한 정수를 뽑아내려면
Math.random을 어떤식으로 구성해야 할까요?
Math.floor(Math.random() ... )
… 부분을 어떤식으로 작성하면 5에서 13사이의 정수를 뽑아낼까요?
두 정수 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을 반복문 아래 한 번 내려보신 후 생각해 보시는게 좋을 것 같케요
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
감사합니다! 덕분에 해결하였습니다