Javascript에서 난수 생성기 시드
P粉006977956
P粉006977956 2023-08-23 23:03:23
0
2
561

JavaScript에서 난수 생성기(Math.random)를 시드하는 것이 가능합니까?

P粉006977956
P粉006977956

모든 응답 (2)
P粉482108310

아니요, 씨앗을 뿌리는 것은 불가능합니다Math.random().ECMAScript 사양은 주제에 대해 의도적으로 모호하여 시딩 방법을 제공하지 않거나 브라우저가 동일한 알고리즘을 사용하도록 요구합니다. 따라서 이러한 기능은 외부에서 제공되어야 하는데, 다행히도 그다지 어렵지 않습니다.

저는 순수 JavaScript로 멋지고 짧고 빠른의사 난수 생성기(PRNG) 기능을 여러 가지 구현했습니다. 이들 모두는 시드될 수 있으며 고품질의 숫자를 제공할 수 있습니다. 이는 보안 목적이 아닙니다. 시드 가능한 CSPRNG가 필요한 경우ISAAC를 확인하세요. p>

먼저 PRNG를 올바르게 초기화하도록 주의하세요.단순화를 위해 아래 생성기에는 기본 시드 생성 프로세스가 없지만 PRNG의 초기시드 상태로 하나 이상의 32비트 숫자를 허용합니다. 유사하거나 희박한 시드(예: 1과 2의 단순 시드)는 엔트로피가 낮고 상관 관계 또는 기타 무작위성 품질 문제를 일으킬 수 있으며 때로는 유사한 속성을 갖는 출력이 발생합니다(예: 무작위로 생성된 수준이 유사함). 이를 방지하려면 균일하게 분포된 고엔트로피 시드를 사용하여 PRNG를 초기화하거나 처음 15개 정도의 숫자 이상으로 진행하는 것이 가장 좋습니다.

이 작업을 수행하는 방법은 여러 가지가 있지만 여기에는 두 가지가 있습니다. 첫째,해시 함수는 짧은 문자열에서 시드를 생성하는 데 매우 효과적입니다. 두 문자열이 유사하더라도 좋은 해시 함수는 매우 다른 결과를 생성하므로 문자열에 너무 많은 생각을 할 필요가 없습니다. 다음은 해시 함수의 예입니다.

으아악

Callcyrb128은 문자열에서 128비트 해시 값을 생성하며, 이는 PRNG를 시드하는 데 사용할 수 있습니다. 사용 방법은 다음과 같습니다.

으아악

참고: 조금 더 강력한 128비트 해시를 원한다면 더 철저하지만 대규모 배열에서 작동하도록 설계된MurmurHash3_x86_128을 고려하세요.

또는 일부 더미 데이터를 선택하여 시드를 채우고 생성기를 미리 몇 번(12~20회 반복) 진행하여 초기 상태를 완전히 혼합하세요. 이는 더 간단하다는 이점이 있으며 PRNG의 참조 구현에 자주 사용되지만 초기 상태 수는 제한됩니다.

으아악

참고: 이러한 PRNG 함수의 출력은 양수 32비트 숫자(0~232-1)를 생성한 다음Math.random()에 해당하는 0~1(0 포함, 1 제외) 사이의 부동 소수점 숫자로 변환됩니다. , 특정 범위의 난수를 원한다면MDN에서 이 기사를 읽어보세요. 원래 비트만 원하는 경우 마지막 나누기 작업을 제거하면 됩니다.

JavaScript 숫자는 최대 53비트 해상도의 정수만 나타낼 수 있습니다. 비트 연산을 사용하면 이 값은 32로 줄어듭니다. 다른 언어로 된 최신 PRNG는 종종 64비트 작업을 사용하는데, 이는 JS로 포팅할 때 shim이 필요하며 이로 인해 성능이상당히저하될 수 있습니다. 여기의 알고리즘은 JS와 직접 호환되므로 32비트 작업만 사용합니다.


sfc32 (간단하고 빠른 카운터)

sfc32PractRand난수 테스트 모음의 일부입니다(물론 통과합니다). sfc32는 128비트 상태를 가지며 JS에서 매우 빠릅니다.

으아악

궁금하실 수도 있습니다.| 是什么? 0>>>= 0是用于。这些本质上是 32 位整数转换,用于性能优化。 JS 中的Number기본적으로 모두 부동 소수점 숫자이지만 비트 연산을 수행하면 32비트 정수 모드로 전환됩니다. 이 모드는 JS 인터프리터에 의해 더 빠르게 처리되지만 곱셈이나 덧셈으로 인해 부동 소수점으로 다시 전환되어 성능 저하가 발생합니다.

멀베리 32

Mulberry32는 32비트 상태의 간단한 생성기이지만 속도가 매우 빠르고 임의성이 좋습니다. (저자는 전체 232주기로gjrand테스트 스위트를 통과했다고 말하지만 아직 확인하지 않았습니다.) .

으아악

간단하지만괜찮은PRNG가 필요하고 수십억 개의 난수가 필요하지 않은 경우 이 방법을 추천합니다(생일 질문참조).

xoshiro128**

2018년 5월 현재,xoshiro128**은 Vigna와 Blackman이 개발한Xorshift 제품군의 새로운 구성원입니다(Vigna 교수는 대부분의Math.random구현을 지원하는 Xorshift128+ 알고리즘도 담당하고 있습니다). 128비트 상태를 제공하는 가장 빠른 생성기입니다.

으아악

저자는 무작위성 테스트를 매우 잘 통과했다고 주장합니다(주의사항에도 불구하고). 다른 연구자들은 TestU01(특히 LinearComp 및 BinaryRank)의 일부 테스트에 실패했다고 지적했습니다. 실제로 부동 소수점 숫자로 작업할 때(예: 이러한 구현에서) 문제가 발생해서는 안 되지만, 원래의 최하위 비트에 의존하는 경우 문제가 발생할 수 있습니다.

JSF(젠킨스 패스트)

Bob Jenkins(2007)의 첫 번째 JSF 또는 "smallprng"입니다. 및Ghost Hash.통과PractRand 테스트를 통과했으며 sfc32만큼 빠르지는 않지만 상당히 빠릅니다.

으아악
    P粉596161915

    아니요, 시드하는 것은 불가능합니다Math.random(). 하지만 자신만의 생성기를 작성하는 것은 상당히 쉽습니다. 또는 기존 생성기를 사용하는 것이 더 좋습니다.

    보기:이 관련 질문.

    또한파종에 대한 자세한 내용을 알아보려면 David Bau의 블로그를 참조하세요.

      최신 다운로드
      더>
      웹 효과
      웹사이트 소스 코드
      웹사이트 자료
      프론트엔드 템플릿
      회사 소개 부인 성명 Sitemap
      PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!