2010-02-26 4 views
17

자바 스크립트에서 Math.random을 사용하여 임의성을 얻는 방법은 무엇입니까? 저는 무작위로 약 50 가지 옵션 중에서 선택하는 것을 만들었습니다. 내 임의성을 얻기 위해 Math.random을 사용하는 것이 얼마나 편안해야하는지 궁금합니다. 사양에서자바 스크립트에서 Math.random을 사용하여 임의성을 얻는 방법은 무엇입니까?

+2

@David : 당신이 알고있는 것처럼 그것은 임의적 인 것이 아닙니다. 존 폰 노이만 (John von Neumann)은 다음과 같이 설명합니다. * "무작위 자릿수를 산술적으로 산출하는 방법을 고려하는 사람은 물론 죄의 상태에 있습니다."* 그들은 PRNG를 사용하고 있습니다. 의사 난수 생성기. – cocotwo

+0

@cocotwo : 모든 JS가 psuedo random이어야한다는 의미는 아닙니다. Bob이 아래에 게시 한 스펙에서 실제 무작위 일 수 있습니다. 이전처럼 어려운 것은 아니지만 실제 RNG를 사용하는 것은 구현에 달려 있습니다. –

+2

아래 답변 중 일부는 말하고 싶은 것은 실제로하고 싶은 일에 달려 있습니다. 저는 99 %의 사례를 의심합니다.'Math.random'은 괜찮습니다. 그러나 잠재적으로 예측 될 수 있습니다. –

답변

14

:

랜덤()

긍정적 0 이상인 사인 있지만 미만으로 숫자 값을 반환 임의로 선택하거나 임의로 의사 와 구현 종속적 알고리즘 또는 전략을 사용하여 해당 범위에서 대략 균일 한 분포 이 함수는 인수를 취하지 않습니다.

답변은 사용중인 JavaScript 엔진에 따라 다릅니다.

나는 모든 브라우저에서 동일한 전략 또는 어떤 그 전략은 불행하게도

그것은 당신의 목적을 위해 괜찮을 것입니다을 사용하는 경우 확실하지 않다. 많은 양의 숫자를 처리하는 경우에만 패턴을 볼 수 있습니다.

+0

@cocotow 외. 나는 psudo-randomness가 좋든 싫든 날씨가 궁금 해서요? 나는 그것의 porobobly가 라스베가스 또는 과학을 위해 충분히 좋지 않다는 것을 짐작할 것입니다 그러나 매일 필요를 위해 충분히 좋다? (나는 결정을 내릴 수있는 결정을 내릴 결정을 내릴 것이다. – David

+4

자바 스크립트의'Math.random()'이 일상적으로 필요로하는 것만으로도 충분하다. 괜찮다. –

+0

@JohnFeminella " 일상적 요구 " – user877329

2

임의로 100 % 임의로 사용하여. 시간이 지남에 따라 파종되므로 매번 실행하면 결과가 달라집니다. 임의 충분히 :)

- 나는 "허위 사실, 거짓, 진실"가지고 ...

... 당신의 브라우저 주소 표시 줄

javascript:alert(Math.random() * 2 > 1); 

을이를 붙여 넣기하고 Enter 키를 몇 번 [입력]

+1

코드 예는 임의 생성기의 임의성을 보여주지 않습니다. , 당신이 비뚤어 짐을 도입 했으므로 실제 값보다 더 많은 거짓 값을 초래할 것입니다. 아주 약간의 차이는 있지만 여전히 임의의 그것을 잘못 사용해서. – Guffa

+0

사실 ...하지만 50 개의 체크 박스가 있다면 ... 내가 준 샘플도 데이빗의 질문에 충분할 것입니다. –

3

정확한 구현은 물론 브라우저에 따라 다소 다를 수 있지만 모든 종류의 의사 난수 생성 프로그램을 사용합니다. 실제로는 무작위는 아니지만 모든 일반적인 목적에 충분히 적합합니다.

암호화와 같은 예외적 인 임의성이 필요한 무언가에 사용하는 경우 임의성에 대해 걱정해야합니다. 그렇다면 어쨌든 Javascript를 거의 사용하지 않을 것입니다.

1

이것은 내가이 일을 참지 못하고, 조금 잔인한 사람입니다 ...하지만 : 당신은 당신의 브라우저의 주소 표시 줄에이 작업을 수행 할 수

. 그것은 0과 4, 100000 번 사이에서 난수를 생성합니다. 그리고 각 숫자가 생성 된 횟수와 하나의 난수가 다른 숫자를 따라 한 횟수를 출력합니다.

Firefox 3.5.2에서 실행했습니다. 모든 수는 거의 같다 - 편향이 없음을 나타내며 숫자가 생성되는 방식에 명백한 패턴이 없음을 나타냅니다. 인 Math.random (사용

javascript: 
var max = 5; 
var transitions = new Array(max); 
var frequency = new Array(max); 
for (var i = 0; i < max; i++) 
{ 
    transitions[i] = new Array(max); 
} 
var old = 0, curr = 0; 
for (var i = 0; i < 100000; i++) 
{ 
    curr = Math.floor(Math.random()*max); 
    if (frequency[curr] === undefined) 
    { 
     frequency[curr] = -1; 
    } 
    frequency[curr] += 1; 
    if (transitions[old][curr] === undefined) 
    { 
     transitions[old][curr] = -1; 
    } 
    transitions[old][curr] += 1; 
    old = curr; 
} 
alert(frequency); 
alert(transitions); 
+1

이것은 과도하지 않습니다. 완전히 부족합니다. 배포판을 보면 엔트로피 품질에 대해 많이 알려주지 않으며, 다른 사람들이 말했듯이 정확한 동작은 구현에 따라 다르므로 파이어 폭스 3.5.2를 테스트하면 일반적인 상황에 대해 아무 것도 말하지 않습니다. –

11

) 중앙에서 OAuth를 들어, 결과를 이용하여, 즉 &을 풀링하지 않는 경우 괜찮습니다.

예를 들어, 우리 사이트에서는 Math.random()을 사용하여 OAuth와 함께 사용할 임의의 "nonce"문자열을 생성했습니다. 원래 JavaScript library은 Math를 사용하여 미리 지정된 목록에서 문자를 선택하여 수행했습니다.랜덤() : 즉

for (var i = 0; i < length; ++i) { 
    var rnum = Math.floor(Math.random() * chars.length); 
    result += chars.substring(rnum, rnum+1); 
} 

문제입니다, 사용자가 (심지어 10 문자 길이 사용 - 이론적 ~ 10^18 조합) 중복 넌스 문자열을 얻고 있었다 일반적으로 서로 몇 초 이내에,. 내 추측은 타임 스탬프에서 파생 된 Math.random()이 다른 포스터 중 하나 인 이유 때문입니다.

+3

타임 스탬프 기반 시드가 동시 환경에서 중복 된 숫자를 생성하는 방법을 설명하는 +1입니다. – Twilite

관련 문제