Ich habe zum Spaß einen kleinen Generator für Lotto-6- und Lotto-7-Zahlen gebaut.
Implementierung
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];}Mersenne-Twister-Implementierung
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 };}Wichtige Punkte
- Set: erzeugt eindeutige Zahlen ohne Duplikate
- Mersenne Twister: hochwertiger Pseudozufallszahlengenerator
- Bereich: Lotto 6 nutzt 1-43, Lotto 7 nutzt 1-37
Zusammenfassung
Mit dem Mersenne Twister lassen sich qualitativ bessere Zufallszahlen als mit Math.random() erzeugen.
Ob das bei einer echten Ziehung hilft, ist eine andere Frage. Als Übung zur Implementierung eines Pseudozufallsalgorithmus ist es aber ein gutes Beispiel.
hsb.horse