돌아가기

의사 난수 생성기

개발을 하다 보면 임의의 데이터가 필요한 경우가 자주 생깁니다.

테스팅을 진행할 때도 임의의 데이터가 필요할 수 있습니다. 정형화된 데이터가 아닌 랜덤한 텍스트나 숫자 등을 입력해 테스트를 진행하는 것이 좋기 때문입니다.

자바스크립트에서는 Math.random()을 사용해 난수를 만들 수 있습니다. 그런데 테스트 도중 문제가 생겨 테스트를 중단했다가 소스 코드를 고치고 다시 테스트를 재개할 때는 이전에 문제를 일으켰던 데이터와 동일한 데이터를 입력해 같은 문제가 발생하는지 살펴보아야 합니다.

이를 위해 '고정값 의사 난수 생성기’가 사용됩니다. 고정값 의사 난수 생성기는 첫 번째 값을 '고정값’으로 삼고, 생성기 안에 저장된 공식을 사용해 두 번째 값을 생성합니다. 고정값이 같으면 난수 생성기에서 차례대로 나오는 값들이 동일하므로 난수 생성 흐름을 쉽게 재현할 수 있습니다. 고정값만 기억해 두면 됩니다.

다소 균일하게 분포된 값을 생성하는 공식의 예는 다음과 같습니다.

next = previous * 16807 % 2147483647

고정값으로 1을 사용하면 생성기에서 나오는 값은 다음과 같습니다.

  1. 16807
  2. 282475249
  3. 1622650073
  4. …기타 등등…

이번 과제는 고정값을 받아 위 공식을 사용해 제너레이터를 만들어내는 함수인 pseudoRandom(seed)을 만드는 것입니다.

예시:

let generator = pseudoRandom(1);

alert(generator.next().value); // 16807
alert(generator.next().value); // 282475249
alert(generator.next().value); // 1622650073

테스트 코드가 담긴 샌드박스를 열어 정답을 작성해보세요.

function* pseudoRandom(seed) {
  let value = seed;

  while(true) {
    value = value * 16807 % 2147483647
    yield value;
  }

};

let generator = pseudoRandom(1);

alert(generator.next().value); // 16807
alert(generator.next().value); // 282475249
alert(generator.next().value); // 1622650073

다음과 같이 일반 함수를 사용하여 동일한 작업을 수행 할 수 있음에 유의하세요.

function pseudoRandom(seed) {
  let value = seed;

  return function() {
    value = value * 16807 % 2147483647;
    return value;
  }
}

let generator = pseudoRandom(1);

alert(generator()); // 16807
alert(generator()); // 282475249
alert(generator()); // 1622650073

일반 함수 또한 제너레이터와 같은 기능을 수행합니다. 그러나 일반 함수는 for..of을 이용해 반복하여 다른 곳에서 유용할 수 있는 제너레이터 구성 사용 능력을 잃게 합니다.

테스트 코드가 담긴 샌드박스를 열어 정답을 확인해보세요.