어떻게 자바 스크립트 예에서 지정된 두 변수 사이의 임의의 정수를 생성 할 수 있습니다 x = 4
와 y = 8
의 것 출력 어떤 4, 5, 6, 7, 8
?
답변
Mozilla Developer Network 페이지 에는 몇 가지 예가 있습니다 .
/**
* Returns a random number between min (inclusive) and max (exclusive)
*/
function getRandomArbitrary(min, max) {
return Math.random() * (max - min) + min;
}
/**
* Returns a random integer between min (inclusive) and max (inclusive).
* The value is no lower than min (or the next integer greater than min
* if min isn't an integer) and no greater than max (or the next integer
* lower than max if max isn't an integer).
* Using Math.round() will give you a non-uniform distribution!
*/
function getRandomInt(min, max) {
min = Math.ceil(min);
max = Math.floor(max);
return Math.floor(Math.random() * (max - min + 1)) + min;
}
그 뒤에 논리가 있습니다. 세 가지 간단한 규칙입니다.
Math.random()
Number
0 (포함)과 1 (제외) 사이의 값을 반환합니다 . 따라서 다음과 같은 간격이 있습니다.
[0 .................................... 1)
이제 min
(포함)과 max
(독점) 사이의 숫자를 원합니다 .
[0 .................................... 1)
[min .................................. max)
를 사용하여 Math.random
[min, max) 간격으로 상대방을 가져올 수 있습니다 . 그러나 먼저 min
두 번째 간격에서 빼서 약간의 문제를 고려해야 합니다.
[0 .................................... 1)
[min - min ............................ max - min)
이것은 다음을 제공합니다.
[0 .................................... 1)
[0 .................................... max - min)
우리는 이제 Math.random
통신원을 적용 하고 계산할 수 있습니다 . 난수를 선택합시다 :
Math.random()
|
[0 .................................... 1)
[0 .................................... max - min)
|
x (what we need)
따라서를 찾으 x
려면 다음을 수행하십시오.
x = Math.random() * (max - min);
min
다시 추가하는 것을 잊지 마십시오 . [min, max) 간격으로 숫자를 얻습니다.
x = Math.random() * (max - min) + min;
이것이 MDN의 첫 번째 기능이었습니다. 두 번째는, 사이의 정수를 반환 min
하고 max
, 모두 포함합니다.
이제 정수를 얻으려면 round
, ceil
또는을 사용할 수 있습니다 floor
.
을 사용할 수 Math.round(Math.random() * (max - min)) + min
있지만 분포가 고르지 않습니다. 둘 다, min
그리고 max
거의 절반의 확률로 롤을합니다 :
min...min+0.5...min+1...min+1.5 ... max-0.5....max
└───┬───┘└────────┬───────┘└───── ... ─────┘└───┬──┘ ← Math.round()
min min+1 max
로 max
간격에서 제외, 그것보다 롤에 더 적은 기회가있다 min
.
Math.floor(Math.random() * (max - min +1)) + min
당신 과 함께 완벽하게 고른 분포가 있습니다.
min.... min+1... min+2 ... max-1... max.... max+1 (is excluded from interval)
| | | | | |
└───┬───┘└───┬───┘└─── ... ┘└───┬───┘└───┬───┘ ← Math.floor()
min min+1 max-1 max
롤링의 기회가 약간 줄어 들었 으므로 원치 않는 결과를 롤링 할 수 있기 때문에 ceil()
와 -1
등식을 사용할 수 없습니다 .max
min-1
답변
var randomnumber = Math.floor(Math.random() * (maximum - minimum + 1)) + minimum;
답변
Math.random ()
min ( 포함 )과 max ( 포함 ) 사이 의 정수 난수를 반환합니다 .
function randomInteger(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
또는 min ( 포함 )과 max ( 포함되지 않음 ) 사이의 임의의 숫자 :
function randomNumber(min, max) {
return Math.random() * (max - min) + min;
}
유용한 예 (정수) :
// 0 -> 10
Math.floor(Math.random() * 11);
// 1 -> 10
Math.floor(Math.random() * 10) + 1;
// 5 -> 20
Math.floor(Math.random() * 16) + 5;
// -10 -> (-2)
Math.floor(Math.random() * 9) - 10;
** 그리고 항상 상기시켜주는 것이 좋습니다 (Mozilla) :
Math.random ()은 암호로 안전한 임의의 숫자를 제공하지 않습니다. 보안과 관련하여 사용하지 마십시오. 대신 Web Crypto API를 사용하십시오.보다 정확하게는 window.crypto.getRandomValues () 메소드입니다.
답변
function getRandomizer(bottom, top) {
return function() {
return Math.floor( Math.random() * ( 1 + top - bottom ) ) + bottom;
}
}
용법:
var rollDie = getRandomizer( 1, 6 );
var results = ""
for ( var i = 0; i<1000; i++ ) {
results += rollDie() + " "; //make a string filled with 1000 random numbers in the range 1-6.
}
고장:
우리는 함수 함수에서 빌려온 함수를 반환합니다. 함수 함수는 호출 될 때 값 bottom
과 top
에 포함 된 임의의 정수를 반환 합니다. 반환 할 수있는 숫자 범위에 아래쪽과 위쪽을 모두 포함 시키려고하므로 ‘포함’이라고합니다. 이 방법으로 getRandomizer( 1, 6 )
1, 2, 3, 4, 5 또는 6을 반환합니다.
(아래가 낮은 숫자, 위가 큰 숫자)
Math.random() * ( 1 + top - bottom )
Math.random()
0과 1 사이의 임의의 두 배를 반환하고, 우리는 곱셈 그 사이에 하나 개 플러스의 차이에 의한 경우 top
와 bottom
, 우리는 사이에 두 곳을거야 0
하고 1+b-a
.
Math.floor( Math.random() * ( 1 + top - bottom ) )
Math.floor
숫자를 가장 가까운 정수로 내림합니다. 이제 0
와 사이에 모든 정수가 top-bottom
있습니다. 1은 혼란스러워 보이지만 항상 반올림하기 때문에 거기에 있어야하므로 최상위 숫자가 없으면 실제로 도달하지 않습니다. 우리가 요구를 생성하는 랜덤 진수 범위로 0
에 (1+top-bottom)
우리가 범위의 int를 내림 얻을 수 0
에top-bottom
Math.floor( Math.random() * ( 1 + top - bottom ) ) + bottom
이전 예제의 코드는 범위에서 우리에게 정수를 준 0
그리고 top-bottom
우리가 지금해야 할 일은 추가하므로, bottom
범위의 정수를 얻기 위해 그 결과 bottom
와 top
포함합니다. :디
참고 : 정수가 아닌 값이나 더 큰 숫자를 먼저 전달하면 바람직하지 않은 동작이 발생하지만 다른 사람이 요청하지 않으면 원래 질문의 의도와는 거리가 멀기 때문에 인수 확인 코드를 자세히 조사하지 않습니다. .
답변
function randomRange(min, max) {
return ~~(Math.random() * (max - min + 1)) + min
}
Underscore.js 를 사용하는 경우 대안으로 사용할 수 있습니다.
_.random(min, max)
답변
1에서 10 사이의 난수를 반환합니다.
Math.floor((Math.random()*10) + 1);
1에서 100 사이의 난수를 반환합니다.
Math.floor((Math.random()*100) + 1)
답변
0에서 최대 사이의 변수가 필요한 경우 다음을 사용할 수 있습니다.
Math.floor(Math.random() * max);