[javascript] 특정 범위에서 JavaScript로 임의의 정수를 생성합니까?

어떻게 자바 스크립트 예에서 지정된 두 변수 사이의 임의의 정수를 생성 할 수 있습니다 x = 4y = 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()Number0 (포함)과 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등식을 사용할 수 없습니다 .maxmin-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.
}

고장:

우리는 함수 함수에서 빌려온 함수를 반환합니다. 함수 함수는 호출 될 때 값 bottomtop에 포함 된 임의의 정수를 반환 합니다. 반환 할 수있는 숫자 범위에 아래쪽과 위쪽을 모두 포함 시키려고하므로 ‘포함’이라고합니다. 이 방법으로 getRandomizer( 1, 6 )1, 2, 3, 4, 5 또는 6을 반환합니다.

(아래가 낮은 숫자, 위가 큰 숫자)

Math.random() * ( 1 + top - bottom )

Math.random()0과 1 사이의 임의의 두 배를 반환하고, 우리는 곱셈 그 사이에 하나 개 플러스의 차이에 의한 경우 topbottom, 우리는 사이에 두 곳을거야 0하고 1+b-a.

Math.floor( Math.random() * ( 1 + top - bottom ) )

Math.floor숫자를 가장 가까운 정수로 내림합니다. 이제 0와 사이에 모든 정수가 top-bottom있습니다. 1은 혼란스러워 보이지만 항상 반올림하기 때문에 거기에 있어야하므로 최상위 숫자가 없으면 실제로 도달하지 않습니다. 우리가 요구를 생성하는 랜덤 진수 범위로 0(1+top-bottom)우리가 범위의 int를 내림 얻을 수 0top-bottom

Math.floor( Math.random() * ( 1 + top - bottom ) ) + bottom

이전 예제의 코드는 범위에서 우리에게 정수를 준 0그리고 top-bottom우리가 지금해야 할 일은 추가하므로, bottom범위의 정수를 얻기 위해 그 결과 bottomtop포함합니다. :디


참고 : 정수가 아닌 값이나 더 큰 숫자를 먼저 전달하면 바람직하지 않은 동작이 발생하지만 다른 사람이 요청하지 않으면 원래 질문의 의도와는 거리가 멀기 때문에 인수 확인 코드를 자세히 조사하지 않습니다. .


답변

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);