logo hsb.horse
← 블로그 목록으로 돌아가기

블로그

TypeScript로 로토6·로토7 추첨 숫자 생성하기

메르센 트위스터를 사용해 로토6·로토7 번호를 생성하는 TypeScript 구현. 의사난수 생성기의 실전 예시.

게시일:

가볍게 로토6·로토7 숫자 생성기를 만들어 봤다.

구현

function generateLottoNumbers(lot: 6 | 7): number[] {
if (![6, 7].includes(lot)) {
throw new Error('引数は6または7である必要があります');
}
const { random } = createMersenneTwister();
const min = 1, max = lot === 6 ? 43 : 37
const numbers = new Set<number>();
while (numbers.size < lot) {
numbers.add(Math.floor(random() * (max - min + 1)) + min);
}
return [...numbers];
}

메르센 트위스터 구현

export function createMersenneTwister(seed: number = new Date().getTime()) {
let index = 624;
const MT = new Array(624);
MT[0] = seed;
for (let i = 1; i < 624; i++) {
MT[i] = (1812433253 * (MT[i - 1] ^ (MT[i - 1] >>> 30)) + i) >>> 0;
}
function generateNumbers() {
for (let i = 0; i < 624; i++) {
const y = (MT[i] & 0x80000000) + (MT[(i + 1) % 624] & 0x7fffffff);
MT[i] = MT[(i + 397) % 624] ^ (y >>> 1);
if (y % 2 !== 0) {
MT[i] ^= 2567483615;
}
}
}
function random() {
if (index >= 624) {
generateNumbers();
index = 0;
}
let y = MT[index++];
y ^= (y >>> 11);
y ^= (y << 7) & 2636928640;
y ^= (y << 15) & 4022730752;
y ^= (y >>> 18);
return (y >>> 0) / 4294967296;
}
return { random };
}

포인트

  • Set: 중복 없는 숫자를 생성
  • 메르센 트위스터: 품질이 좋은 의사난수 생성기
  • 범위 지정: 로토6은 1-43, 로토7은 1-37

정리

메르센 트위스터를 쓰면 Math.random() 보다 품질이 좋은 난수를 만들 수 있다.

실제 추첨에 당첨될지는 별개지만, 의사난수 알고리즘 구현 연습용으로는 괜찮은 소재다.