>웹 프론트엔드 >JS 튜토리얼 >JavaScript에서 반복 가능한 난수 시퀀스를 어떻게 만들 수 있나요?

JavaScript에서 반복 가능한 난수 시퀀스를 어떻게 만들 수 있나요?

Linda Hamilton
Linda Hamilton원래의
2024-11-04 06:50:01905검색

How can I create a repeatable sequence of random numbers in JavaScript?

JavaScript 난수 생성기에 대한 사용자 정의 시드 제공

기본 JavaScript Math.random() 함수는 [0 범위 내에서 임의의 값을 생성합니다. , 1]이지만 사용자 정의 시드를 설정할 수는 없습니다. 결과적으로 생성된 난수 시퀀스는 반복 불가능합니다.

사용자 정의 가능한 시드가 있는 JavaScript 난수 생성기를 생성하려면 다음과 같은 여러 옵션을 탐색할 수 있습니다.

Math.random( ) 도우미 함수:

사용자 정의 시드가 필요하지 않은 경우 도우미 함수와 함께 Math.random()을 활용하여 반복 가능한 값 범위(예: randRange(start, end))를 생성할 수 있습니다. .

의사 난수 생성기(PRNG):

무작위성을 더 잘 제어하려면 Mersenne Twister와 같은 PRNG를 사용하는 것이 좋습니다. 그러나 구현이 복잡합니다. 대안은 구현하기가 더 쉽고 적절한 무작위성을 제공하는 선형 합동 생성기(LCG)입니다.

LCG 구현(Short Seedable RNG):

아래는 LCG를 사용한 짧은 시드 가능 RNG 구현 예:

<code class="js">function RNG(seed) {
  this.m = 0x80000000; // 2**31;
  this.a = 1103515245;
  this.c = 12345;

  this.state = seed ? seed : Math.floor(Math.random() * (this.m - 1));
}

RNG.prototype.nextInt = function() {
  this.state = (this.a * this.state + this.c) % this.m;
  return this.state;
};

RNG.prototype.nextFloat = function() {
  // returns in range [0,1]
  return this.nextInt() / (this.m - 1);
};

RNG.prototype.nextRange = function(start, end) {
  // returns in range [start, end): including start, excluding end
  // can't modulu nextInt because of weak randomness in lower bits
  var rangeSize = end - start;
  var randomUnder1 = this.nextInt() / this.m;
  return start + Math.floor(randomUnder1 * rangeSize);
};

RNG.prototype.choice = function(array) {
  return array[this.nextRange(0, array.length)];
};</code>

RNG를 사용하려면:

<code class="js">var rng = new RNG(20);
for (var i = 0; i < 10; i++)
  console.log(rng.nextRange(10, 50));

var digits = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'];
for (var i = 0; i < 10; i++)
  console.log(rng.choice(digits));</code>

위 내용은 JavaScript에서 반복 가능한 난수 시퀀스를 어떻게 만들 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.