Implementei por diversão um pequeno gerador de números para Lotto 6 e Lotto 7.
Implementação
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];}Implementação do Mersenne Twister
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 };}Pontos
- Set: gera números sem repetição
- Mersenne Twister: gerador pseudoaleatório de alta qualidade
- Faixa: Lotto 6 usa 1-43, Lotto 7 usa 1-37
Resumo
Com o Mersenne Twister, dá para gerar números aleatórios de qualidade melhor do que Math.random().
Se isso vai acertar um sorteio real já é outra história, mas como prática de implementação de algoritmo pseudoaleatório é um bom exercício.
hsb.horse