2011-12-15 5 views
1

Math.random처럼 동작하는 JavaScript 함수를 처음부터 작성할 수 있습니까?random()이없는 random()와 같은 함수

+0

모든 적당한 [의사 난수 생성기 (http://en.wikipedia.org/wiki/Pseudorandom_number_generator)는 객체 또는 전역 변수를 통해 호출간에 _state_를 유지해야합니다. 클라이언트가 재사용하거나 글로벌 변수에 액세스하여 호출간에 지속되는 객체를 갖게됩니까? – sarnold

+0

아니요. 'Math.random'이 (가) 상태를 유지합니까? – Randomblue

+0

난수 생성에 대한 깊은 이해를 얻기 전까지 ... 특히 암호를하려는 경우. – Incognito

답변

2

예 당신이, 당신이 당신의 자신의 LCG 번호 생성기를 구현할 수 있습니다 (즉함으로써 내가. Math.random를 사용하지 않고 의미)하지만 Sarnold 언급대로 호출 사이에 상태를 유지해야합니다.

+0

'Math.random'은 어떤 방식 으로든 상태를 유지합니까? – Randomblue

+0

@Randomblue Math.random이하는 일은 확실하지 않지만 LCG 알고리즘은 이전 값을 사용하여 다음 값을 생성합니다. –

+0

상태 (또는 다시 말하면 재귀)를 유지하지 않으면 임의성을 생성 할 수 없습니다. 모든 난수 생성기는 사실 매우 혼란스럽고 결정적인 프로세스입니다. –

0

임의의 임의성이 필요하지만 문법을 찾기 위해 게으른 경우 일반적으로 수행하는 작업은 logistic map (개별 혼란 시스템)을 구현하는 것입니다. 의사 코드에서이 같이 있습니다 :

var x = 0.234;  // or some other number between 0 and 1 (but not 0.5) 
for (var n=1; n<=100;n++){ 
    x = 4 * x * (1-x); // this is the iteration 
    console.log(x); 
} 

이 정말 무작위로하지만 충분한 임의 많은 경우 100 개 어떻게 든 임의의 숫자를 인쇄한다. 자바 스크립트 답변을 제공하지 않아 죄송합니다. 10 년 동안 사용하지 않았습니다.

2

@ OscarGomez의 답변에 대한 답변은 linear congruential generator이고, 여기에 일반 JavaScript 기능으로 난수 생성기가 들어 있습니다. 물론, "임의성"(현재는 짧은 사이클로 인해 매우 좋지 않음)의 품질은 둘러싸인 객체 "o"의 상수 값을 선택하는 데 따라 달라집니다.

var random = (function() { 
    var o = {mod: 13, mul: 11, inc: 7, x: 0}; 
    return function() { 
    return o.x = (o.mul * o.x + o.inc) % o.mod 
    } 
})(); 
random(); // => 7 
random(); // => 6 
random(); // => 8 
random(); // => 4 

여기 개별 인스턴스 생성과 씨앗을 가질 수보다 휴대용 버전이다 :

function Random(s) { 
    this.seed = s || 0; 
    this.mod = 13; 
    this.mul = 11; 
    this.inc = 7; 
    this.x = this.seed; 
} 

Random.prototype.next = function() { 
    return (this.x = (this.mul * this.x + this.inc) % this.mod); 
}; 

var r = new Random(1); 
r.next(); // => 5 
r.next(); // => 10 
r.next(); // => 7 
+0

seed seed = new Date(). getTime();'에 대해 항상 밀리 초 시간을 사용하는 것이 안전하거나 임의성에 영향을 미칩니 까? –

관련 문제