귀하의 질문에 대한 간단한 대답 은 규칙 # 2 를 Math.random()
위반하는 것입니다.
여기에있는 다른 많은 답변은 존재 Math.random()
가이 기능이 순수하지 않다는 것을 의미한다고 지적했습니다 . 그러나 나는 그것을 사용하는 기능을 오염시키는 이유를 말할 가치가 있다고 생각 Math.random()
합니다.
모든 의사 난수 생성기와 마찬가지로 Math.random()
"시드"값으로 시작합니다. 그런 다음이 값을 낮은 수준의 비트 조작 체인 또는 예측할 수없는 (실제로 무작위가 아닌 ) 출력 을 초래하는 기타 작업의 시작점으로 사용합니다 .
JavaScript에서 관련된 프로세스는 구현에 따라 다르며 다른 많은 언어와 달리 JavaScript는 시드를 선택할 수있는 방법을 제공 하지 않습니다 .
구현은 난수 생성 알고리즘에 대한 초기 시드를 선택합니다. 사용자가 선택하거나 재설정 할 수 없습니다.
이것이이 함수가 순수하지 않은 이유입니다. JavaScript는 기본적으로 사용자가 제어 할 수없는 암시 적 함수 매개 변수를 사용합니다. 다른 곳에서 계산되고 저장된 데이터에서 해당 매개 변수를 읽고 있으므로 정의의 규칙 # 2를 위반합니다.
이 함수를 순수 함수로 만들고 싶다면 여기에 설명 된 대체 난수 생성기 중 하나를 사용할 수 있습니다 . 그 발전기를 호출하십시오 seedable_random
. 하나의 매개 변수 (시드)를 사용하고 "무작위"숫자를 반환합니다. 물론,이 숫자는 전혀 무작위가 아닙니다. 그것은 종자에 의해 유일하게 결정됩니다. 이것이 이것이 순수한 기능인 이유입니다. 의 출력은 seedable_random
입력을 기반으로 출력을 예측하는 것이 어렵다는 의미에서 "무작위"일뿐입니다.
이 함수의 순수 버전은 세 가지 매개 변수 를 가져야합니다 .
function test(min, max, seed) {
return seedable_random(seed) * (max - min) + min;
}
주어진 세 개의 (min, max, seed)
매개 변수에 대해 항상 동일한 결과를 반환합니다.
의 출력 seedable_random
이 진정으로 무작위가되도록하려면 시드를 무작위 화하는 방법을 찾아야합니다! 그리고 어떤 전략을 사용하든, 기능 외부의 소스에서 정보를 수집해야하기 때문에 필연적으로 순수하지 않을 것입니다. 으로 mtraceur 및 jpmc26 나를 생각 나게,이 모든 물리적 접근을 포함한다 : 하드웨어 난수 발생기를 , 렌즈 캡 웹캠 , 대기 소음 수집 - 심지어 용암 램프 . 이 모든 것에는 함수 외부에서 계산되고 저장된 데이터를 사용하는 것이 포함됩니다.
Math.random()
RNG의 상태를 변경하는 것을 호출합니다 .