Skip to content

Latest commit

ย 

History

History
343 lines (261 loc) ยท 7.42 KB

File metadata and controls

343 lines (261 loc) ยท 7.42 KB

CubeEngine v2.0.0 - ์‚ฌ์šฉ ๊ฐ€์ด๋“œ

๐Ÿ“Œ ์ด์ œ cube-engine.js ํ•˜๋‚˜๋กœ ๋ชจ๋“  ๊ธฐ๋Šฅ ์‚ฌ์šฉ ๊ฐ€๋Šฅ!

๐ŸŽฏ ์ฃผ์š” ๊ธฐ๋Šฅ

1๏ธโƒฃ ์ œ์™ธ ์ˆซ์ž (excludeNumbers)

ํŠน์ • ๋ฒˆํ˜ธ๋ฅผ ์ œ์™ธํ•˜๊ณ  ์ถ”์ถœ

2๏ธโƒฃ ๊ตฌ๊ฐ„ ์„ค์ • (rangeStart, rangeEnd)

10~100 ๊ฐ™์€ ๋ฒ”์œ„์—์„œ๋งŒ ์ถ”์ถœ

3๏ธโƒฃ ๋‹ค์–‘ํ•œ ๊ฒŒ์ž„ ํ”„๋ฆฌ์…‹

๋กœ๋˜, ํŒŒ์›Œ๋ณผ, ์œ ๋กœ๋ฐ€๋ฆฌ์–ธ, ํ‚ค๋…ธ ๋“ฑ

4๏ธโƒฃ Firebase ์—ฐ๋™

ํ•™์Šต ๋ฐ์ดํ„ฐ ์˜์†ํ™” ์ง€์›


๐Ÿ“– ์‚ฌ์šฉ ์˜ˆ์ œ

์˜ˆ์ œ 1: ๋กœ๋˜ 6/45 ๊ธฐ๋ณธ

const result = await CubeEngine.generate({
    items: 45,
    pick: 6
});

console.log(result.results); // [[1,7,15,23,31,42], ...]

์˜ˆ์ œ 2: ์ œ์™ธ ์ˆซ์ž ์‚ฌ์šฉ

// 2, 5, 17๋ฒˆ ์ œ์™ธํ•˜๊ณ  ์ถ”์ถœ
const result = await CubeEngine.generate({
    items: 45,
    pick: 6,
    excludeNumbers: [2, 5, 17]  // โœ… ์ด ๋ฒˆํ˜ธ๋“ค์€ ์ ˆ๋Œ€ ์•ˆ๋‚˜์˜ด
});

์˜ˆ์ œ 3: ๊ตฌ๊ฐ„ ์„ค์ •

// 10~30 ๊ตฌ๊ฐ„์—์„œ๋งŒ 6๊ฐœ ์ถ”์ถœ
const result = await CubeEngine.generate({
    items: 45,      // ์ „์ฒด ๋ฒ”์œ„๋Š” 45์ง€๋งŒ
    pick: 6,
    rangeStart: 10, // โœ… 10๋ฒˆ๋ถ€ํ„ฐ
    rangeEnd: 30    // โœ… 30๋ฒˆ๊นŒ์ง€๋งŒ ์‚ฌ์šฉ
});

// ๊ฒฐ๊ณผ ์˜ˆ: [12, 15, 19, 22, 27, 30]

์˜ˆ์ œ 4: ์ œ์™ธ + ๊ตฌ๊ฐ„ ๋™์‹œ ์‚ฌ์šฉ

// 10~50 ๊ตฌ๊ฐ„์—์„œ 3, 15, 27 ์ œ์™ธํ•˜๊ณ  ์ถ”์ถœ
const result = await CubeEngine.generate({
    items: 100,
    pick: 5,
    rangeStart: 10,
    rangeEnd: 50,
    excludeNumbers: [3, 15, 27]
});

์˜ˆ์ œ 5: ํ”„๋ฆฌ์…‹ ์‚ฌ์šฉ

// ๋กœ๋˜ 6/45
const lotto = await CubeEngine.generate(
    CubeEngine.presets.lotto645
);

// ๋ฏธ๊ตญ ํŒŒ์›Œ๋ณผ
const powerball = await CubeEngine.generate(
    CubeEngine.presets.powerball
);

// ํ‚ค๋…ธ (80๊ฐœ ์ค‘ 20๊ฐœ)
const keno = await CubeEngine.generate(
    CubeEngine.presets.keno
);

์˜ˆ์ œ 6: ํ”„๋ฆฌ์…‹ + ์ปค์Šคํ…€ ์˜ต์…˜

// ๋กœ๋˜ ํ”„๋ฆฌ์…‹์— ์ œ์™ธ์ˆซ์ž ์ถ”๊ฐ€
const result = await CubeEngine.generate(
    CubeEngine.withPreset('lotto645', {
        excludeNumbers: [7, 13, 21],
        history: pastDraws  // ๊ณผ๊ฑฐ ๋‹น์ฒจ๋ฒˆํ˜ธ
    })
);

์˜ˆ์ œ 7: ๊ณผ๊ฑฐ ๋ฐ์ดํ„ฐ ํ•™์Šต

const pastDraws = [
    [3, 12, 18, 25, 34, 41],
    [5, 9, 17, 22, 38, 44],
    // ... ๋” ๋งŽ์€ ๊ณผ๊ฑฐ ๋‹น์ฒจ๋ฒˆํ˜ธ
];

const result = await CubeEngine.generate({
    items: 45,
    pick: 6,
    history: pastDraws,  // โœ… ML ํ•™์Šต์— ์‚ฌ์šฉ
    excludeNumbers: [13] // 13๋ฒˆ ์ œ์™ธ
});

์˜ˆ์ œ 8: Firebase ์—ฐ๋™

// ์ด์ „ ํ•™์Šต ๋ฐ์ดํ„ฐ ๋กœ๋“œ
const savedData = await firebase.get('engine_data');

const result = await CubeEngine.generate({
    items: 45,
    pick: 6,
    externalProbMap: savedData.probMap,   // ์ €์žฅ๋œ ํ™•๋ฅ ๋งต
    initialPool: savedData.pool,          // ์ด์ „ ์„ธ๋Œ€ ํ’€
    persistenceWeight: 0.7                // 70% ์œ ์ง€
});

// ๊ฒฐ๊ณผ ์ €์žฅ
await firebase.save({
    probMap: result.probMap,
    pool: result.fullPool
});

์˜ˆ์ œ 9: ์ง„ํ–‰์ƒํ™ฉ ๋ชจ๋‹ˆํ„ฐ๋ง

const result = await CubeEngine.generate({
    items: 45,
    pick: 6,
    
    onProgress: (percent, stats) => {
        console.log(`์ง„ํ–‰: ${percent}%`);
        console.log(`๋ผ์šด๋“œ: ${stats.round}/${stats.totalRounds}`);
        console.log(`์ตœ๊ณ ์ ์ˆ˜: ${stats.bestScore}`);
    },
    
    onRound: (roundNum, bestScore) => {
        console.log(`๋ผ์šด๋“œ ${roundNum} ์™„๋ฃŒ: ${bestScore}`);
    }
});

๐ŸŽฎ ๊ฒŒ์ž„๋ณ„ ํ”„๋ฆฌ์…‹

// ํ•œ๊ตญ ๋กœ๋˜ 6/45
CubeEngine.presets.lotto645

// ํ•œ๊ตญ ๋กœ๋˜ 6/38 (๊ณผ๊ฑฐ)
CubeEngine.presets.lotto638

// ๋ฏธ๊ตญ ํŒŒ์›Œ๋ณผ
CubeEngine.presets.powerball

// ๋ฏธ๊ตญ ๋ฉ”๊ฐ€๋ฐ€๋ฆฌ์–ธ
CubeEngine.presets.megamillions

// ์œ ๋Ÿฝ ์œ ๋กœ๋ฐ€๋ฆฌ์–ธ
CubeEngine.presets.euromillions

// ํ‚ค๋…ธ (80๊ฐœ ์ค‘ 20๊ฐœ)
CubeEngine.presets.keno

// ๋น ๋ฅธ ํ…Œ์ŠคํŠธ์šฉ
CubeEngine.presets.fast

// ์™„์ „ ์ปค์Šคํ…€
CubeEngine.presets.custom

โš™๏ธ ์ „์ฒด ์˜ต์…˜

const result = await CubeEngine.generate({
    // โ”€โ”€ ํ•„์ˆ˜ โ”€โ”€
    items: 45,          // ์ „์ฒด ์•„์ดํ…œ ๊ฐœ์ˆ˜
    pick: 6,            // ์„ ํƒํ•  ๊ฐœ์ˆ˜
    
    // โ”€โ”€ ๋ฒ”์œ„ ์ œ์–ด โ”€โ”€
    rangeStart: 10,     // ์‹œ์ž‘ ๋ฒˆํ˜ธ (null์ด๋ฉด 1๋ถ€ํ„ฐ)
    rangeEnd: 40,       // ๋ ๋ฒˆํ˜ธ (null์ด๋ฉด items๊นŒ์ง€)
    excludeNumbers: [13, 27], // ์ œ์™ธํ•  ๋ฒˆํ˜ธ๋“ค
    
    // โ”€โ”€ ํ•™์Šต ๋ฐ์ดํ„ฐ โ”€โ”€
    history: [[...], [...]],  // ๊ณผ๊ฑฐ ๋‹น์ฒจ๋ฒˆํ˜ธ
    
    // โ”€โ”€ Firebase ์—ฐ๋™ โ”€โ”€
    externalProbMap: {...},   // ์ €์žฅ๋œ ํ™•๋ฅ ๋งต
    initialPool: [[...], ...], // ์ด์ „ ์„ธ๋Œ€ ํ’€
    persistenceWeight: 0.7,    // ๊ธฐ์กด ์ง€์‹ ์œ ์ง€์œจ
    
    // โ”€โ”€ ์—”์ง„ ํŠœ๋‹ โ”€โ”€
    lambda: 0.18,        // ์‹œ๊ฐ„ ๊ฐ€์ค‘์น˜
    learningRate: 0.05,  // ML ํ•™์Šต๋ฅ 
    evolveTime: 80,      // ์ง„ํ™” ์‹œ๊ฐ„(ms)
    rounds: 50,          // ๋ผ์šด๋“œ ์ˆ˜
    poolSize: 2500,      // ํ›„๋ณด ํ’€ ํฌ๊ธฐ
    topN: 5,             // ์ตœ์ข… ๊ฒฐ๊ณผ ๊ฐœ์ˆ˜
    threshold: 5,        // ์œ ์‚ฌ๋„ ์ž„๊ณ„๊ฐ’
    
    // โ”€โ”€ ์ฝœ๋ฐฑ โ”€โ”€
    onProgress: (percent, stats) => {},
    onRound: (round, score) => {},
    onComplete: (result) => {}
});

๐Ÿ“ฆ ๊ฒฐ๊ณผ ๊ตฌ์กฐ

{
    results: [          // ์ถ”์ฒœ ์กฐํ•ฉ๋“ค
        [1, 7, 15, 23, 31, 42],
        [3, 12, 18, 27, 35, 41],
        // ...
    ],
    scores: [           // ๊ฐ ์กฐํ•ฉ์˜ ์ ์ˆ˜
        487.32,
        452.18,
        // ...
    ],
    probMap: {          // ๋ฒˆํ˜ธ๋ณ„ ํ™•๋ฅ 
        1: 0.142,
        2: 0.089,
        // ...
    },
    fullPool: [...],    // ์ „์ฒด ํ›„๋ณด ํ’€ (Firebase ์ €์žฅ์šฉ)
    meta: {             // ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ
        items: 45,
        pick: 6,
        validPoolSize: 42,      // ์œ ํšจ ๋ฒˆํ˜ธ ๊ฐœ์ˆ˜
        excludedCount: 3,       // ์ œ์™ธ๋œ ๋ฒˆํ˜ธ ๊ฐœ์ˆ˜
        rangeStart: 1,
        rangeEnd: 45,
        elapsed: 12583,         // ์†Œ์š”์‹œ๊ฐ„(ms)
        historySize: 1105,      // ํ•™์Šต ๋ฐ์ดํ„ฐ ํฌ๊ธฐ
        generatedAt: "2025-02-14T08:30:00.000Z"
    }
}

๐Ÿšจ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ

try {
    const result = await CubeEngine.generate({
        items: 45,
        pick: 6,
        rangeStart: 40,
        rangeEnd: 43,
        excludeNumbers: [40, 41, 42, 43]  // โŒ ์œ ํšจ ๋ฒˆํ˜ธ 0๊ฐœ!
    });
} catch(error) {
    console.error(error.message);
    // "์œ ํšจํ•œ ๋ฒˆํ˜ธ๊ฐ€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. (ํ•„์š”:6, ๊ฐ€๋Šฅ:0)"
}

๐Ÿ’ก ์‹ค์ „ ํ™œ์šฉ ์˜ˆ์ œ

๋กœ๋˜ ๋ฐ˜์ž๋™ ๋ฒˆํ˜ธ

// ์‚ฌ์šฉ์ž๊ฐ€ 3๊ฐœ ์„ ํƒ (7, 15, 23)
// ๋‚˜๋จธ์ง€ 3๊ฐœ๋Š” AI๊ฐ€ ์ถ”์ฒœ (10~40 ๊ตฌ๊ฐ„, 13 ์ œ์™ธ)

const result = await CubeEngine.generate({
    items: 45,
    pick: 3,              // 3๊ฐœ๋งŒ ์ถ”์ถœ
    rangeStart: 10,
    rangeEnd: 40,
    excludeNumbers: [7, 15, 23, 13],  // ์‚ฌ์šฉ์ž ์„ ํƒ + ์ œ์™ธ
    history: pastDraws
});

const final = [7, 15, 23, ...result.results[0]].sort((a,b) => a-b);
// [7, 12, 15, 23, 28, 35]

๐ŸŽฏ ์š”์•ฝ

๊ธฐ๋Šฅ ์˜ต์…˜ ์˜ˆ์ œ
์ œ์™ธ ์ˆซ์ž excludeNumbers: [2,5,17] ํŠน์ • ๋ฒˆํ˜ธ ์•ˆ๋‚˜์˜ค๊ฒŒ
๊ตฌ๊ฐ„ ์„ค์ • rangeStart: 10, rangeEnd: 30 10~30๋งŒ ์‚ฌ์šฉ
๊ฒŒ์ž„ ํ”„๋ฆฌ์…‹ CubeEngine.presets.powerball ํŒŒ์›Œ๋ณผ ์„ค์ •
๊ณผ๊ฑฐ ํ•™์Šต history: [[...], [...]] ML ํ•™์Šต
Firebase externalProbMap, initialPool ํ•™์Šต ์˜์†ํ™”

๋ฒ„์ „: v1.3.0-universal
๋ผ์ด์„ ์Šค: MIT
์ œ์ž‘: CubeEngine Team