[javascript] 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 자리 숫자를 제공합니다.

정규 분포 (가우스 분포라고도 함) 와 같은 난수에 대한 다른 분포도 있습니다.


답변

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

개인적으로 XKCD 에서 훔 쳤지 만 내 구현이 더 좋을 것이라고 생각 합니다.

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


답변

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

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


답변

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


답변

Chaos Game 에서 JS 의사 난수 생성기를 사용해 보았습니다 .

Sierpiński 삼각형 은 꽤 무작위라고 말합니다.
프랙탈