IT

JavaScript의 Math.random은 무작위입니까?

lottoking 2020. 7. 30. 09:35
반응형

JavaScript의 Math.random은 무작위입니까?


6 년 동안 웹 사이트에 난수 생성기 페이지 사이트에 . 오랫동안 Google에서 "무작위 번호 생성기"에 대한 첫 번째 또는 두 번째 결과였으며 토론 포럼 및 블로그에서 수백 개의 콘테스트 및 그림이 아닌 경우 결정하는 데 사용됩니다. 웹 로그 및 일반적으로 사용).

누군가 오늘 생각보다 무작위가 아닐 수도 있다고 이메일을 보냈습니다 . 그녀는 매우 큰 난수 (예 : 1에서 10000000000000000000 사이)를 생성하려고 시도하고 거의 항상 같은 자릿수임을 발견했습니다. 나는 함수를 루프에 싸서 수천 개의 숫자를 생성 할 수있는 매우 큰 숫자의 경우 약 2 자릿수에 불고기했습니다.

왜?

다음은 루핑 버전 직접 제작 볼 수 있습니다.

http://andrew.hedges.name/experiments/random/randomness.html

여기에는 Mozilla 개발자 네트워크에 포함 되지 않는 것 같은 구현 과 더 이상 존재하지 않는 웹 페이지 (Paul Houle의 "Central Randomizer 1.3")를 포함하여 1997 년 코드가 포함됩니다. 어떻게 작동하는지 확인합니다.

Mersenne Twister여기다른 곳을 읽었습니다 . 내가 관심있는 것은 JavaScript의 내장 Math.random 함수 의 결과에서 더 큰 변화가없는 이유 입니다. 감사합니다!


1에서 100 사이의 숫자가 주어집니다.

  • 9는 1 자리 (1-9)입니다.
  • 90은 2 자리 (10-99)입니다.
  • 1은 3 자리 숫자 (100)

1에서 1000 사이의 숫자가 주어집니다.

  • 9는 1 자리 숫자입니다
  • 90은 2 자리 숫자입니다
  • 900은 3 자리 숫자입니다
  • 1은 4 자리 숫자입니다

등등.

따라서 무작위로 일부를 선택하면 대부분의 값이 같은 자릿수를 갖기 때문에 선택한 숫자의 갖습니다.


결과는 실제로 예상됩니다. 난수가 1에서 10 ^ n 범위로 될 수 있습니다. 즉, 숫자의 약 9/10에 n 자리가 있고, 9/100에 n-1 자리가 예상됩니다.


여러 유형이 있습니다. Math.random 은 즉 한 숫자 숫자를 제공합니다.

다른 차수를 사용하여 전력 법칙을 사용하여 지수 함수를 만드는 것이 좋습니다 .

function random_powerlaw(mini, maxi) {
    return Math.ceil(Math.exp(Math.random()*(Math.log(maxi)-Math.log(mini)))*mini)
}

이 기능은 2 자리 숫자 및 3 자리 숫자와 같은 수의 1 자리 숫자를 제공해야합니다.

정규 경우 와 같은 난수에 대한 다른 경우에도 있습니다 (가우시안 경우에만 함).


다음 문서는 주요 웹 브라우저에서 math.random ()이 안전하지 않은 방법을 설명합니다. "주요 브라우저에서 임시 사용자 추적 및 도메인 간 정보 유출 및 공격"Amid Klein (2008) . 일반적인 Java 또는 Windows 내장 PRNG 기능보다 강력하지 않습니다.

반면, 2 ^ 19937-1 기간의 SFMT를 구현할 각 PRNG 시퀀스에 대해 2496 바이트의 내부 상태가 유지되어야합니다. 어떤 사람들이 소유주를 용서할 수없는 비용으로 생각할 수 있습니다.


나에게 완벽하게 무작위로 보인다! (힌트 : 브라우저에 따라 늘어서 있습니다.)

개인적으로, 나는 XKCD 에서 그것을 빼앗 았지만 항상 인정 해야하는 구현이 더 나을 것이라고 생각 합니다.

function random() {
  return 4; // Chosen by a fair dice throw. Guaranteed to be random.
}

10000000000000000000과 같은 숫자를 사용하면 Javascript가 사용하는 데이터 유형의 긴급을 넘어서는 것입니다. 생성 된 모든 숫자는 "00"으로 끝납니다.


Chaos Game 에서 JS 의사 난수 생성기를 시도했습니다 .

Sierpiński 삼각형 은 매우라고 대답합니다.프랙탈


글쎄요, 만약 당신이 1e6까지의 숫자를 생성한다면, 거의 같은 확률로 모든 숫자를 얻을 수 있기를 바랍니다. 이는 또한 한 자릿수가 적은 숫자를 얻을 확률이 10 분의 1 밖에 없다는 것을 의미합니다. 100 분의 1의 확률로 두 자릿수를 줄일 수 있습니다. 다른 RNG를 사용할 때 큰 차이를 볼 수 있을지 의심 스럽습니다. 왜냐하면 로그가 아닌 숫자에 걸쳐 균일 한 분포를 가지기 때문입니다.


1에서 N까지 균일하게 분포 된 난수가 아닌 숫자는 동일한 속성을 갖습니다. (어떤 의미에서) 그것은 정밀도의 문제라는 점에 유의하십시오. 0-99 (정수)의 균일 분포는 두 자리 숫자의 90 %를 갖습니다. 0-999999의 균등 분포에는 5 자리 숫자가 905 개 있습니다.

너무 제한적이지 않은 조건 하에서 모든 숫자 세트는 밀도를 갖습니다. "무작위"숫자에 대해 논의하고 싶을 말이 숫자의 밀도를 지정해야합니다. 지수 밀도, 법선 밀도 등이 있습니다. 어떤 밀도가 적절한 지 선택하기 전에 난수 생성기를 제안해야합니다. 또한, 한 밀도에서 나오는 숫자는 종종 우연한 방법으로 다른 밀도로 쉽게 변환 될 수 있습니다.

참고 URL : https://stackoverflow.com/questions/1062902/how-random-is-javascripts-math-random

반응형