머리말
프론트 엔드 개발, 특히 게임 개발에서는 임의의 숫자가 종종 사용되므로 다음을 생각합니다. Math.random , 다음 코드를 살펴 보겠습니다.
for (var i = 0; i <10; i ++) {document.writeln (math.random ()+<br />); }위의 코드를 실행하면 10 개의 다른 숫자가 생성됩니다. 물론 당신은 더 많이 생성 할 수 있습니다. 그게 전부라면이 기사를 쓸 필요가 없습니다.
예
그것에 대해 생각하려고 노력하십시오. 우리가 특정 시나리오에서 게임을 만들고 사용자가 연극을 반쯤 나가기 때문에 사용자가 다음에 들어올 때 이전 진행 상황을 계속 선택할 수 있도록 문제는 다음과 같습니다. 이제 우리는 사용자 재생 진행 및 사용자 포인트와 같은 간단한 설명 데이터를 기록 할 수 있지만, 장애물, 비행 객체 및 많은 장식 가제트가 게임에서 그리기 시작하는 등의 위치를 기록하기 시작합니다. 불필요한.
임의의 종자 번호가 나타납니다. 요소가 캔버스에 무작위로 그려 질 때 종자 값이 있고, 페이지의 모든 요소의 위치, 크기 등 이이 시드에 따라 계산되면, 두 번째 도면이 그려지면 이전에 미완성 된 캔버스 요소를 재현하기 위해이 씨앗 만 전달하면됩니다.
그런 다음 현재 JS와 함께 제공되는 Math.Random이 잘 작동하지 않으며 요구를 충족시킬 수 없다는 것을 알게 될 것입니다. 이 코드를 계속 살펴 보겠습니다.
코드 사본은 다음과 같습니다.
Math.seed = 5; Math.seedrandom = function (max, min) {max = max || 1; 최소 = 최소 || 0; Math.seed = (Math.seed * 9301 + 49297) % 233280; var rnd = math.seed / 233280.0; 반환 min + rnd * (max -min); }; for (var i = 0; i <10; i ++) {document.writeln (math.seedrandom ()+<br />); }
위의 코드를 실행하면 시드 수학이 변경되지 않으면 생성 된 임의 숫자가 변경되지 않습니다. 오,이 기능이 도입되면 게임 장면을 재현 할 수 있습니다. 자세한 내용은 필요하지만 메커니즘을 보장 할 수 있습니다. 이 기사의 초점은 그러한 게임을 구현하는 것이 아닙니다.
이 기사의 초점은 다음과 같습니다.
Seedrandom과 같은 의사 랜덤 번호 생성기를 선형 합동 생성기 (LCG, 선형 합동 생성기)라고합니다. 런타임 라이브러리가 제공하는 거의 모든 랜드는 LCG를 사용합니다.
i n+1 = ai n+c (mod m)
생성 된 의사 랜덤 수 순서의 최대주기 M은 0과 M-1 사이입니다. 이 최대주기를 달성하려면 다음을 충족해야합니다.
1.C와 M은 상호 배타적입니다
2.a -1은 m의 모든 주요 요인으로 나눌 수 있습니다.
3. m이 4의 배수 인 경우 a -1은 4의 배수 여야합니다.
위의 세 가지를 Hull-Dobell 정리라고합니다. 의사 랜덤 번호 생성기로서, 사이클이 충분히 크지 않으면 갇히게하는 것이 당황 스럽기 때문에 이것이 요구 사항 중 하나입니다. 따라서 다음은 다음과 같습니다. a = 9301, c = 49297, m = 233280. 위의 세 가지 항목은 모두 만족됩니다.
요약
위는 JS에서 종자 임의 숫자를 구현하고 기능하는 방법에 대한 소개입니다. JavaScript 학습자에게 도움이되기를 바랍니다.