Hybrid Cube Evolution ร ML Probability Engine
๋ฒ์ฉ ํ๋ฅ ๊ธฐ๋ฐ ์กฐํฉ ์ถ์ฒ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
๋ฆด๋ฆฌ์ฆ: 2026-02-17
๐พ ๋ฐฑํ ์คํ ์ฒดํฌํฌ์ธํธ ์๊ตฌ ์ ์ฅ (window.storage)
- ๋ธ๋ผ์ฐ์ ๋ฅผ ๋๊ฐ๋ค ๋์์๋ ์ค๋จ๋ ์ง์ ์์ ์ด์ด์ ์งํ
- 50ํ ์ฒญํฌ ์๋ฃ๋ง๋ค
window.storage์ ์๋ ์ ์ฅ - ํ์ด์ง ๋ก๋ ์ ์ ์ฅ๋ ์ฒดํฌํฌ์ธํธ ์๋ ๊ฐ์ง ๋ฐ ๋ณต์
- ๋ณต์ ์ ๋ฐฑํ ์คํ ํจ๋ ์๋ ํ์ + [โถ ๊ณ์] ๋ฒํผ ์ฆ์ ํ์ฑํ
- ์ฒ์๋ถํฐ ์ฌ์์ / ์ ์ฒด ์๋ฃ ์ ์ฒดํฌํฌ์ธํธ ์๋ ์ญ์
์ ์ฅ ํญ๋ชฉ
| ํญ๋ชฉ | ์ค๋ช |
|---|---|
currentProbMap |
์ค๋จ ์์ ์ ํ๋ฅ ๋งต |
cumulativeHistory |
๋์ ๋น์ฒจ ๋ฒํธ ์ด๋ ฅ |
cumulativeBonus |
๋์ ๋ณด๋์ค ๋ฒํธ ์ด๋ ฅ |
nextIdx |
๋ค์ ์คํํ testDraws ์ธ๋ฑ์ค |
TRAIN_UNTIL |
์ด๊ธฐ ํ์ต ๊ฒฝ๊ณ ํ์ฐจ |
totalProcessed |
์ ์ฒด ์ฒ๋ฆฌ ํ์ฐจ ์ |
repeatRound |
์ ์ฒด ๋ฐ๋ณต ํ์ |
btStats |
์ ์ค ํต๊ณ (6๊ฐ/5๊ฐ/4๊ฐ/3๊ฐ/2๊ฐ ์ดํ) |
btAutoNext |
์๋ ๊ณ์ ์ฒดํฌ๋ฐ์ค ์ํ |
btRepeat |
์๋ ๋ฐ๋ณต ์ฒดํฌ๋ฐ์ค ์ํ |
allDraws(์ ์ฒด ๋น์ฒจ ์ด๋ ฅ)๋ ์ฉ๋ ์ ์ฝ์ ์ํด ์ ์ฅํ์ง ์๊ณ , ์ด์ด๊ฐ๊ธฐ ์ Firebase์์ ์๋ ์ฌ๋ก๋ํฉ๋๋ค.
| ๋ฒ์ | ๋ ์ง | ํต์ฌ ๋ณํ |
|---|---|---|
| v2.5.2 | 2026-02-17 | ๋ฐฑํ ์คํ ๋งค ํ์ฐจ ์๋ ์ ์ฅ + ๋ก๋ ์น ์ ์ฉ ๋ถ๋ฆฌ |
| v2.5.1 | 2026-02-17 | ํธ๋ ๋ ์๋์ฐ ์ถ์ (100โ60/20ํ) + ๋ฐฑํ ์คํ ์ฒดํฌํฌ์ธํธ ์๊ตฌ ์ ์ฅ |
| v2.5.0 | 2026-02-16 | 5์ข ์งํ ํธ๋ ๋ ํ์ต + ๋ฐฑํ ์คํ ์ฒดํฌํฌ์ธํธ |
| v2.4.0 | 2026-02-16 | 6์ข ํธ๋ ๋ ์ ๋ฉด ๋ฐ์ (ํ์ง/AC/์ฐ์/๋์/ํฉ/๊ณ ์ ) |
| v2.3.0 | 2026-02-16 | ์์ ๊ตฌ์ญ ํธ๋ ๋ (zoneTrend) ๋ฐ์ |
| v2.2.4 | 2026-02-16 | ๐ฅ Firebase ๋ธ๋ ๋ฉ ๊ตฌ์กฐ ๊ทผ๋ณธ ์์ (๋์ ๊ณ ์ฐฉ ํด๊ฒฐ) |
| v2.2.1 | 2026-02-16 | ๋ฒํธ ์ ๋ฆผ ๋ฒ๊ทธ ์์ (probMap ๋์ ๊ฐฑ์ ์ ๊ฑฐ) |
| v2.1.0 | 2026-02-16 | StatCache + WeightedProb + historySet O(1) ์ต์ ํ |
| v2.0.0 | - | ๊ตฌ์กฐ ๊ฐํธ (Firebase ์ฐ๋, excludeNumbers, ์ ์ํ ํ์ต) |
| v1.0.0 | - | ์ต์ด ๋ฆด๋ฆฌ์ฆ (๋ฒ์ฉํ, ํ๋ฆฌ์ , ์ฝ๋ฐฑ) |
๋ฐฑํ ์คํ (index.html)
๋งค ํ์ฐจ ์๋ ์ ์ฅ + ๋ก๋ ์น ์ ์ฉ ๋ถ๋ฆฌ
๋ฌธ์ ์
- ๊ธฐ์กด: 50ํ ๋จ์ ์ ์ฅ โ ์ค๊ฐ์ ๋ธ๋ผ์ฐ์ ์ข ๋ฃ ์ ์ต๋ 50ํ ์์ค
- ๊ธฐ์กด: ๋ฐฑํ ์คํ ๊ฒฐ๊ณผ๊ฐ ์๋์ผ๋ก ๋ก๋ ์น์ ์ ์ฉ โ ์๋์น ์์ ๋ฎ์ด์ฐ๊ธฐ ์ํ
๋ณ๊ฒฝ์ฌํญ
์ ์ฅ ๊ตฌ์กฐ ์์ ๋ถ๋ฆฌ
| ์ฉ๋ | Firebase ๋ฌธ์ | ์ ์ฅ ์์ | ์ค๋ช |
|---|---|---|---|
| ๋ฐฑํ ์คํ ์งํ๋ | backtest_progress |
๋งค ํ์ฐจ๋ง๋ค ์๋ | ์ค๋จ ํ ์ฌ๊ฐ์ฉ (๋ ๋ฆฝ์ ) |
| ๋ก๋ ์น ํ์ต | shared_engine_state |
์๋ (๋ฒํผ ํด๋ฆญ) | ์ค์ ๋ก๋ ์น ์ ์ฉ์ฉ |
๋งค ํ์ฐจ ์๋ ์ ์ฅ
- ๋ชจ๋ ํ์ฐจ ์คํ ํ ์ฆ์ Firebase + ๋ก์ปฌ ์คํ ๋ฆฌ์ง ์ ์ฅ
- ์ ์ฅ ๋ด์ฉ:
currentProbMap,cumulativeHistory,cumulativeBonus,nextIdx,btStats๋ฑ - ๋ธ๋ผ์ฐ์ ์ข ๋ฃ ์ ๋ฐ์ดํฐ ์์ค 0%
- ๋ฉํฐ ๋๋ฐ์ด์ค ์ง์ (PC โ ์ค๋งํธํฐ โ ํ๋ธ๋ฆฟ ์์ ๋กญ๊ฒ ์ด๋)
์๋ ๋ณต์ (ํ์ด์ง ๋ก๋ ์)
โ Firebase์์ backtest_progress ๋ก๋ ์๋
โก ๋ก์ปฌ ์คํ ๋ฆฌ์ง์์ ์ฒดํฌํฌ์ธํธ ๋ก๋ ์๋
โข ๋ ์ค ์ต์ ๊ฒ ์๋ ์ ํ (savedAt ๋น๊ต)
โฃ BT_STATE ๋ณต์
โค "โถ ์ค๋จ๋ ์ง์ ๋ถํฐ ๊ณ์" ๋ฒํผ ํ์
๋ก๋ ์น ์ ์ฉ (์๋)
- "โ ๋ก๋ ์น์ ์ ์ฉ" ๋ฒํผ ์ถ๊ฐ
- ์ฌ์ฉ์๊ฐ ์ํ ๋๋ง ๋ฐฑํ ์คํ ๊ฒฐ๊ณผ๋ฅผ ๋ก๋ ์น์ ๋ฐ์
backtest_progressโshared_engine_state50:50 ๋ณํฉ- ์๋ ์ ์ฉ ์ ๋จ โ ์ค์๋ก ๋ฎ์ด์ธ ์ํ ์ ๊ฑฐ
UI ๋ณ๊ฒฝ
- โ ์ ๊ฑฐ: "50ํ๋ง๋ค ์๋ ๊ณ์" ์ฒดํฌ๋ฐ์ค (๋ถํ์)
- โ ์ ์ง: "์ ์ฒด ์๋ฃ ์ ์๋ ๋ฐ๋ณต" ์ฒดํฌ๋ฐ์ค
- โ ์ถ๊ฐ: "๐พ ๋งค ํ์ฐจ๋ง๋ค ์๋ ์ ์ฅ" ์๋ด ๋ฌธ๊ตฌ
- โ ๋ณ๊ฒฝ: "โถ ๊ณ์ (๋ค์ 50ํ)" โ "โถ ์ค๋จ๋ ์ง์ ๋ถํฐ ๊ณ์"
์ฌ์ฉ ์๋๋ฆฌ์ค
1. ๋ฐฑํ
์คํ
์์ (1,200ํ ์์ )
2. 300ํ ์งํ ์ค... โ ๋ธ๋ผ์ฐ์ ์ข
๋ฃ
3. ๋ค์๋ ์ฌ์ง์
โ "300ํ์ฐจ๊น์ง ์๋ฃ" ์๋ ๋ณต์
4. "โถ ๊ณ์" ํด๋ฆญ โ 301ํ๋ถํฐ ์ด์ด์ ์งํ
5. 1,200ํ ์๋ฃ โ ๊ฒฐ๊ณผ ํ์ธ
6. ๋ง์กฑ์ค๋ฌ์ฐ๋ฉด "โ
๋ก๋ ์น์ ์ ์ฉ" ํด๋ฆญ
7. ๋ก๋ ์น์ ํ์ต ๊ฒฐ๊ณผ ๋ฐ์ ์๋ฃ!
๊ธฐ๋ ํจ๊ณผ
- โ ๋ฐ์ดํฐ ์์ค ์์ ๋ฐฉ์ง (๋งค ํ์ฐจ ์ ์ฅ)
- โ ๋ฉํฐ ๋๋ฐ์ด์ค ์์ ๋ก์ด ์ด๋
- โ ๋ฐฑํ ์คํ โ ๋ก๋ ์น ์์ ๋ถ๋ฆฌ
- โ ์๋์น ์์ ๋ฎ์ด์ฐ๊ธฐ ๋ฐฉ์ง
- โ ์ฅ์๊ฐ ๋ฐฑํ ์คํ ์์ ํ๊ฒ ์ํ
์์ง (cube-engine.js)
ํธ๋ ๋ ์๋์ฐ ์ถ์ โ ์ต๊ทผ ๋ณํ ๋ฏผ๊ฐ๋ ์ฆ๊ฐ
๋ฌธ์ ์
- ๊ธฐ์กด 50ํ ๋จ์ ํธ๋ ๋ ๋ถ์์ผ๋ก ์ธํด ์ฅ๊ธฐ ํจํด์ ๊ณ ์ฐฉ
- ์ต๊ทผ 10~20ํ์ ๋น ๋ฅธ ๋ณํ๋ฅผ ์ถฉ๋ถํ ๋ฐ์ํ์ง ๋ชปํจ
- ์ถ์ฒ ๋ฒํธ๊ฐ ํน์ ๋ฒ์์ ์ ๋ฆฌ๋ ํ์ ๋ฐ์
๋ณ๊ฒฝ์ฌํญ
| ํธ๋ ๋ ์ข ๋ฅ | ๋ณ๊ฒฝ ์ | ๋ณ๊ฒฝ ํ | ๋น๊ณ |
|---|---|---|---|
| 5์ข ํจํด ํธ๋ ๋ | 100ํ (50+50) | 60ํ (30+30) | ํ์ง/AC/์ฐ์/๋์/ํฉ/๊ณ ์ |
| 5์ข ์งํ ํธ๋ ๋ | 100ํ (50+50) | 20ํ (10+10) | freq/gap/reHit/bonus |
| ์์ ๊ตฌ์ญ ํธ๋ ๋ | 40ํ (20+20) | 40ํ (20+20) | ์ ์ง |
5์ข ํจํด ํธ๋ ๋ (ํ์ง/AC/์ฐ์/๋์/ํฉ/๊ณ ์ )
- ์๋์ฐ: 100ํ โ 60ํ
- ๋น๊ต: ์ต๊ทผ30ํ vs ์ด์ 30ํ
- ํจ๊ณผ: ์ค๊ธฐ ํจํด ๋ณํ์ ๋ ๋ฏผ๊ฐํ๊ฒ ๋ฐ์
5์ข ์งํ ํธ๋ ๋ (freq/gap/reHit/bonus)
- ์๋์ฐ: 100ํ โ 20ํ
- ๋น๊ต: ์ต์ 10ํ vs ์ด์ 10ํ
- ๋ธํ ์ ๊ทํ ์์ :
dFreq = (์ต์ 10 - ์ด์ 10) / 10 // ๊ธฐ์กด /50 dGap = (์ด์ 10 - ์ต์ 10) / 10 // ๊ธฐ์กด /50 dReHit = (์ต์ 10 - ์ด์ 10) / 5 // ๊ธฐ์กด /10 dBonus = (์ต์ 10 - ์ด์ 10) / 10 // ๊ธฐ์กด /50
- ํจ๊ณผ: ์ต๊ทผ ๋จ๊ธฐ ๋ณํ์ ์ฆ๊ฐ ๋ฐ์
์ต์ ํ์ ๋ฐ์ดํฐ
- 5์ข ํจํด: 60ํ ์ด์
- 5์ข ์งํ: 20ํ ์ด์
- ์์ ๊ตฌ์ญ: 40ํ ์ด์
๊ธฐ๋ ํจ๊ณผ
- โ ์ถ์ฒ ๋ฒํธ ๋ค์์ฑ ์ฆ๊ฐ
- โ ์ต๊ทผ 10~30ํ ๋ณํ์ ๋น ๋ฅธ ๋์
- โ ํน์ ๋ฒํธ ์ ๋ฆผ ํ์ ์ํ
โ ๏ธ ๋จ๊ธฐ ๋ ธ์ด์ฆ ์ํฅ ์ฆ๊ฐ (๋ณ๋์ฑ ์์น)
๋ฐฑํ ์คํ (index.html)
๋ฐฑํ ์คํ ์ฒดํฌํฌ์ธํธ ์๊ตฌ ์ ์ฅ (window.storage)
๋ฌธ์ ์
BT_STATE๊ฐ JavaScript ๋ณ์๋ก๋ง ์กด์ฌ- ๋ธ๋ผ์ฐ์ ๋ฅผ ๋๊ฐ๊ฑฐ๋ ํญ์ ๋ซ์ผ๋ฉด ์งํ ์ํ๊ฐ ์ด๊ธฐํ๋จ
- 50ํ ์ฒดํฌํฌ์ธํธ์์ ๋ฉ์ถ ๋ค ์ฌ์ง์ ์ ์ฒ์๋ถํฐ ๋ค์ ์์ํด์ผ ํ์
๋ณ๊ฒฝ์ฌํญ
window.storage๋ฅผ ์ด์ฉํ ์ฒดํฌํฌ์ธํธ ์๊ตฌ ์ ์ฅ ๊ตฌ์กฐ ์ถ๊ฐ- 50ํ ์ฒญํฌ ์๋ฃ๋ง๋ค Firebase ์ ์ฅ๊ณผ ๋์์ ๋ก์ปฌ์๋ ์๋ ์ ์ฅ
- ํ์ด์ง ๋ก๋ ์
tryRestoreBtCheckpoint()์๋ ์คํ โ ์ ์ฅ๋ ์ํ ๋ณต์
์ ๊ท ํจ์ 4์ข
| ํจ์ | ์ญํ |
|---|---|
saveBtCheckpoint() |
์ฒญํฌ ์๋ฃ๋ง๋ค window.storage์ ์ํ ์ ์ฅ |
loadBtCheckpoint() |
์ ์ฅ๋ ์ฒดํฌํฌ์ธํธ ์ฝ๊ธฐ |
clearBtCheckpoint() |
์ฒดํฌํฌ์ธํธ ์ญ์ (์ฌ์์ยท์๋ฃ ์ ์๋ ํธ์ถ) |
tryRestoreBtCheckpoint() |
ํ์ด์ง ๋ก๋ ์ ์๋ ๋ณต์ ์๋ |
์ฒดํฌํฌ์ธํธ ์ญ์ ์์
| ์ํฉ | ๋์ |
|---|---|
| ์ฒ์๋ถํฐ ์ฌ์์ | clearBtCheckpoint() ํ ์ฌ์์ |
| ์ ์ฒด ๋ฐ์ดํฐ ์์ง ์๋ฃ | clearBtCheckpoint() ์๋ ํธ์ถ |
| ์๋ ๋ฐ๋ณต ๋ชจ๋ | ๋ฐ๋ณต ์ค์๋ ์ฒดํฌํฌ์ธํธ ์ ์ง |
์์ง (cube-engine.js)
5์ข ์งํ ํธ๋ ๋ ๋ถ์ ์ถ๊ฐ
- ๋ถ์ ๋์: freq / recentFreq / gap / reHit / bonus (์์ ์ ์ธ)
- ๋น๊ต ๋ฐฉ์: ์ต์ 50ํ vs ์ด์ 50ํ ๊ฐ ์งํ๋ณ ๋ธํ ๊ณ์ฐ
- freq delta:
์ต์ 50 ์ถํ์ - ์ด์ 50 ์ถํ์ - gap delta:
์ด์ 50 ๊ฐ๊ฒฉ - ์ต์ 50 ๊ฐ๊ฒฉ(gap ๊ฐ์=์ต๊ทผ ๊ฐ์ธ=์์) - reHit delta:
์ต์ 50 ์ฌ์ถํ - ์ด์ 50 ์ฌ์ถํ - bonus delta:
์ต์ 50 ๋ณด๋์ค ๋น๋ - ์ด์ 50 ๋ณด๋์ค ๋น๋
- freq delta:
- ๊ฐ์ค ํฉ์ฐ:
freqร0.30 + recentร0.30 + gapร0.20 + reHitร0.10 + bonusร0.10 - ์ ๊ทํ: delta โ 0~1 ๋ฒ์ (0.5=์ค๋ฆฝ, >0.5=๊ฐ์ธ, <0.5=์ฝ์ธ)
- ์ ์ฉ: buildWeightedProb ๊ฐ์ค์น 10% ๋ฐ์
- ์์ ์ฅ์น: history 50ํ ๋ฏธ๋ง์ด๋ฉด ์ค๋ฆฝ๊ฐ(0.5)์ผ๋ก ๋ฌดํจํ
๋ฐฑํ ์คํ (index.html)
50ํ ์ฒดํฌํฌ์ธํธ ๊ตฌ์กฐ
- ์ด๊ธฐ ํ์ต: 900ํ ํ์ต ํ 901ํ๋ถํฐ 50ํ ๋จ์ ๊ฒ์ฆ
- ์ํ ์ ์ง:
BT_STATE(nextIdx / currentProbMap / cumulativeHistory) - UI ์ปจํธ๋กค:
[โถ ๊ณ์ (๋ค์ 50ํ)]: ํ์ฌ probMap + cumulativeHistory ์ด์ด์ ์คํ[โบ ์ฒ์๋ถํฐ ์ฌ์์]: BT_STATE ์ด๊ธฐํ ํ ์ฌ์์โ 50ํ๋ง๋ค ์๋ ๊ณ์: ์ฒดํฌ ์ 50ํ ์๋ฃ ํ 0.5์ด ๋๊ธฐ ํ ์๋ ๊ณ์โ ๋ฐ์ดํฐ ์์ง ์ ์๋ ๋ฐ๋ณต: ์ ์ฒด ์์ง ํ ์ด์ probMap ๋ฐ์ํ์ฌ ์๋ ์ฌ์์
- ํ์ต ๋์ : ๊ฐ ์ฒญํฌ ์๋ฃ๋ง๋ค backtest_engine_state ์ ์ฅ, ๋ค์ ์ฒญํฌ๋ ์ด์ probMap ๋ฐ์
5์ข ํธ๋ ๋ ์๋์ฐ ๊ณ ์
- ๊ธฐ์กด: ์ ์ฒด trendHistory๋ฅผ ๋์ ์ผ๋ก ๋ฐ์ผ๋ก ๋๋ โ ๋ฐ์ดํฐ ์์ ๋ฐ๋ผ ์๋์ฐ ๋ณ๋
- ๋ณ๊ฒฝ:
tHalf = min(50, floor(length/2))๊ณ ์ โ ์ต๊ทผ50 / ์ด์ 50 - ์์ ํธ๋ ๋๋ ์ต๊ทผ20/์ด์ 20 ์ ๋๊ฐ ๋ฐฉ์ ์ ์ง
๋ฐฑํ ์คํ 50ํ ์ค๋จ/์ฌ๊ฐ๋/๋ฐ๋ณต
| ์ํฉ | ๋์ |
|---|---|
| ์ต์ด ์คํ | 900ํ ์ด๊ธฐํ์ต โ 901ํ๋ถํฐ 50ํ ๊ฒ์ฆ ํ ์ค๋จ |
| ์ฌ๊ฐ๋ | ์ค๋จ ํ์ฐจ๋ถํฐ ์ด์ด์ 50ํ, ์ด์ ํ์ต 50:50 ๋ธ๋ ๋ฉ ๋ฐ์ |
| ๋ฐ๋ณต(์ฒดํฌ๋ฐ์ค) | 900ํ๋ถํฐ ์ฌ์์, ์ด์ ํ์ต 50:50 ๋ธ๋ ๋ฉ ๋ฐ์ |
| ๋ฐ์ดํฐ ๋ ๋๋ฌ | ์๋์ผ๋ก ๋ฐ๋ณต ์ฌ์์ (900ํ๋ถํฐ) |
BT_RESUME_INDEX: ์ค๋จ ์์น ์ ์ฅ (-1=์ฒ์๋ถํฐ)BT_STEP = 50: 1ํ ์คํ๋น ๊ฒ์ฆ ํ์ฐจ ์
์์ ํธ๋ ๋ ๊ตฌ์กฐ ๊ฐ์
๋ฌธ์ ์
- ์ต๊ทผ100ํ ์ ๋ฐ50/ํ๋ฐ50 ๋น์จ(ratio) ๋ฐฉ์
- ์ ๋ฐ ํ๊ท ์ด 0์ ๊ฐ๊น์ธ ๋ ratio ํญ๋ฐ์ ์ฆ๊ฐ โ ํธํฅ ์ ๋ฐ
- 100ํ ์๋์ฐ๊ฐ ๋๋ฌด ๋์ด ์ฅ๊ธฐ ํจํด์ ๋๋ ค๋ค๋
๋ณ๊ฒฝ์ฌํญ
- ์ต๊ทผ20ํ / ์ด์ 20ํ ์ ๋๋ณํ๊ฐ(delta) ๋ฐฉ์
recentAvg = ์ต๊ทผ 20ํ ๊ตฌ์ญ๋ณ ํ์ฐจ๋น ํ๊ท ์ถํ์ prevAvg = ์ด์ 20ํ ๊ตฌ์ญ๋ณ ํ์ฐจ๋น ํ๊ท ์ถํ์ zoneDelta = recentAvg - prevAvg > 0 : ๊ฐ์ธ (์ต๊ทผ์ ๋ ๋ง์ด ์ถํ) < 0 : ์ฝ์ธ (์ต๊ทผ์ ๋ ์ถํ) = 0 : ๋ณดํฉ - ์ ๊ทํ:
delta ยฑ1.2๊ธฐ์ค โ0~1clamp (0.5=๋ณดํฉ) - scoreCombo ๋ณด๋์ค ๊ธฐ์ค ๋ณ๊ฒฝ:
- ๊ธฐ์กด: ratio >= 1.2 โ ๋ณด๋์ค
- ๋ณ๊ฒฝ: delta > 0.2 โ
+delta ร 2.5, delta < -0.2 โ+delta ร 1.5
- ์ถ๊ฐ ๋ฐํ๊ฐ:
stat.zoneAvg,stat.zoneDelta - ์์ ์ฅ์น: history 10ํ ๋ฏธ๋ง ์ ๊ณ์ฐ ์คํต, zoneTrend 0.5(์ค๋ฆฝ) ์ ์ง
6์ข ํธ๋ ๋ ์ ๋ฉด ๋ฐ์
๊ณตํต ๊ตฌ์กฐ
- ์ต๊ทผ 100ํ โ ์ ๋ฐ50 / ํ๋ฐ50 ๋ถ๋ฆฌ
ratio = ํ๋ฐํ๊ท / ์ ๋ฐํ๊ท> 1.0๊ฐ์ธ /< 1.0์ฝ์ธ- ๋ฒ์ ํด๋จํ:
0.5 ~ 2.0
buildStatCache โ trends ๊ฐ์ฒด ์ถ๊ฐ
| # | ํธ๋ ๋ | ๊ณ์ฐ ๋ฐฉ์ |
|---|---|---|
| โ | ํ์ง oddRatio |
ํ์ฐจ๋น ํ์ ๊ฐ์ ์ ๋ฐ/ํ๋ฐ ๋น๊ต |
| โก | AC๊ฐ acAvg / acTrend |
ํ์ฐจ๋น AC๊ฐ ํ๊ท ์ ๋ฐ/ํ๋ฐ ๋น๊ต |
| โข | ์ฐ์์ฑ consecAvg / consecTrend |
ํ์ฐจ๋น ์ฐ์์ ์ ์ ๋ฐ/ํ๋ฐ ๋น๊ต |
| โฃ | ๋์ tailTrend[0~9] |
๋์๋ฆฌ๋ณ ์ถํ์ ์ ๋ฐ/ํ๋ฐ ๋น๊ต |
| โค | ๋ฒํธํฉ sumAvg / sumTrend |
ํ์ฐจ๋น ๋ฒํธํฉ ํ๊ท ์ ๋ฐ/ํ๋ฐ ๋น๊ต |
| โฅ | ๊ณ ์ highRatio |
ํ์ฐจ๋น ๊ณ ๋ฒํธ(23~45) ๊ฐ์ ์ ๋ฐ/ํ๋ฐ ๋น๊ต |
buildWeightedProb โ ๊ฐ์ค์น ์ฌ์ค๊ณ (ํฉ๊ณ 1.00)
freqScore 0.18 (โ0.22)
recentScore 0.18 (โ0.22)
gapScore 0.10 (โ0.13)
reHitScore 0.10 (โ0.13)
bonusScore 0.15
zoneGapScore 0.04 (โ0.05)
colorTrend 0.08 (โ0.10)
oddTrend 0.07 ์ ๊ท โ โ ํ์ง
tailTrend 0.07 ์ ๊ท โ โฃ ๋์
highTrend 0.03 ์ ๊ท โ โฅ ๊ณ ์
scoreCombo โ AC/์ฐ์์ฑ/๋ฒํธํฉ ํธ๋ ๋ ๋ณด๋์ค ์ถ๊ฐ
- โก AC๊ฐ: ์กฐํฉ AC๊ฐ acAvg ยฑ1 ์ด๋ด โ ๋ณด๋์ค, ยฑ2 ์ด๊ณผ โ ๊ฐ์
- โข ์ฐ์์ฑ: ์กฐํฉ ์ฐ์์ ์๊ฐ consecAvg ยฑ0.5 ์ด๋ด โ ๋ณด๋์ค
- โค ๋ฒํธํฉ: ์กฐํฉ ํฉ๊ณ๊ฐ sumAvg ยฑ10 ์ด๋ด โ ๋ณด๋์ค, ยฑ20 ์ด๊ณผ โ ๊ฐ์
- ๋ชจ๋
colorZoneWeight๋น์จ ์ ์ฉ
ํธ๋ ๋ ๋ฌด์ ์์ ์ฅ์น
- history ์์ โ trends ์ ํญ๋ชฉ ๊ธฐ๋ณธ๊ฐ(1.0) โ ์ํฅ ์์
- history 10ํ ๋ฏธ๋ง โ ๊ณ์ฐ ์คํต
- stat/trends ์์ โ scoreCombo ํธ๋ ๋ ๋ธ๋ก ์คํต
์์ ๊ตฌ์ญ ๋ณํ ํธ๋ ๋ ๋ฐ์
๋ฌธ์ ์
- ๊ธฐ์กด ์์ ๊ตฌ์ญ ์ฒ๋ฆฌ(
zoneGap,zoneFreq)๋ ๋จ์ ์ถํ ์ฌ๋ถ/๊ฐ๊ฒฉ๋ง ์ธก์ - ์ต๊ทผ ํ๋ฆ(๊ฐ์ธ/์ฝ์ธ ํธ๋ ๋)์ด probMap์ ๋ฐ์๋์ง ์์
buildStatCache โ zoneTrend ๊ณ์ฐ ์ถ๊ฐ
- ์ต๊ทผ 100ํ๋ฅผ ์ ๋ฐ 50ํ / ํ๋ฐ 50ํ๋ก ๋ถ๋ฆฌ
- ๊ฐ ๊ตฌ์ญ๋ณ ํ์ฐจ๋น ํ๊ท ์ถํ์ ๊ณ์ฐ (์ถํ์ฌ๋ถ 0/1 ์๋ ์ค์ ๊ฐ์)
trendRatio = ํ๋ฐํ๊ท / ์ ๋ฐํ๊ท> 1.0: ๊ฐ์ธ (์ต๊ทผ์ ๋ ๋ง์ด ์ถํ)< 1.0: ์ฝ์ธ (์ต๊ทผ์ ๋ ์ถํ)- ๋ฒ์ ํด๋จํ:
0.5 ~ 2.0
- ์ ๋ฐ ํ๊ท 0์ธ ๊ตฌ์ญ(ํ๋ฒ๋ ๋ฏธ์ถํ): ํ๋ฐ ์ถํ ์ 1.5 ์ฒ๋ฆฌ
buildWeightedProb โ trend ๊ฐ์ค์น 10% ์ ๊ท ๋ฐ์
trendScore[n]= ํด๋น ๋ฒํธ ๊ตฌ์ญ์ trendRatio โ 0~1 ์ ๊ทํ- ๊ฐ์ธ ๊ตฌ์ญ ๋ฒํธ ํ๋ฅ ์์น / ์ฝ์ธ ๊ตฌ์ญ ๋ฒํธ ํ๋ฅ ํ๋ฝ
- ๊ธฐ์กด ๊ฐ์ค์น ์กฐ์ (ํฉ๊ณ 1.00 ์ ์ง):
freqScore 0.25 โ 0.22 recentScore 0.25 โ 0.22 gapScore 0.15 โ 0.13 reHitScore 0.15 โ 0.13 bonusScore 0.15 ์ ์ง zgScore 0.05 ์ ์ง trendScore 0.10 ์ ๊ท
scoreCombo โ ํธ๋ ๋ ๊ฐ์ธ/์ฝ์ธ ๋ณด๋์ค ๋ฐ์
- ๊ฐ์ธ ๊ตฌ์ญ(
trendRatio >= 1.2) ๋ฒํธ ํฌํจ ์+(ratio-1.0)ร3์ ๋ณด๋์ค - ์ฝ์ธ ๊ตฌ์ญ(
trendRatio <= 0.8) ๋ฒํธ ํฌํจ ์-(1.0-ratio)ร2์ ๊ฐ์ colorZoneWeight๋น์จ ์ ์ฉ (๊ธฐ๋ณธ 0.20)scoreCombo(combo, probMap, cfg, stat)โ stat ํ๋ผ๋ฏธํฐ ์ถ๊ฐ
๊ฒ์ฆ ๊ฒฐ๊ณผ
- ํฉ๊ตฌ์ญ ์ฝ์ธ(ratio=0.504), ์ฒญ๊ตฌ์ญ ๊ฐ์ธ(ratio=2.000) ์๋๋ฆฌ์ค
- ์ฒญ๊ตฌ์ญ ํ๊ท ํ๋ฅ / ํฉ๊ตฌ์ญ ํ๊ท ํ๋ฅ = 1.207 (์ฒญ > ํฉ) ์ ์ ํ์ธ
๋ฐฑํ ์คํ ๊ฒฝ๋ก ๋ถ๋ฆฌ + setCubeEngine.html ์ ์ค
๋ฐฑํ ์คํ ๊ฒฝ๋ก ๋ถ๋ฆฌ (index.html)
- ๊ธฐ์กด: ๋ฐฑํ
์คํ
๊ฒฐ๊ณผ๊ฐ
shared_engine_state์ ์ ์ฅ โ ๋ก๋ ์น ํ์ต ์ค์ผ - ๋ณ๊ฒฝ: ๋ฐฑํ
์คํ
โ
backtest_engine_state์ ์ฉ ๋ฌธ์์ ์ ์ฅ - ์ ํจ์:
saveBacktestState(probMap)โ backtest_engine_state์ ๊ฐ์ค ํ๊ท ๋ณํฉ - ์ ๋ฒํผ:
โ ๋ก๋ ์น์ ์ ์ฉโ ๋ฐฑํ ์คํ ์๋ฃ ํ์๋ง ํ์applyBacktestToLive(): backtest + shared 50:50 ๋ณํฉ โ shared_engine_state ์ ์ฅ- confirm ๋ํ์์๋ก ์๋์น ์์ ์ ์ฉ ๋ฐฉ์ง
- ๋ฐ๋ณต ๋ฐฑํ ์คํ ์ ๋ก๋ ์น ํ์ต ์ํฅ ์์
setCubeEngine.html ์ ์ค
- ๋์๋ณด๋ ํค๋
โ๏ธ ์์ง ์ค์ ๋ฒํผ โ setCubeEngine.html ์ด๋ - 4ํญ ๊ตฌ์ฑ:
- ๐ ํ๋ฆฌ์ : lotto645/lotto638/ํ์๋ณผ/๋ฉ๊ฐ๋ฐ๋ฆฌ์ธ/์ ๋ก๋ฐ๋ฆฌ์ธ/์ผ๋ ธ/ํฐ๋ณด/์ปค์คํ
- ๐ง ํ์ต ํ๋ผ๋ฏธํฐ: items/pick/rounds/poolSize/topN/evolveTime + ๊ฐ์ค์น 5์ข ์ฌ๋ผ์ด๋
- ๐ฅ Firebase: collection/document ๊ฒฝ๋ก ์ง์ ์ ๋ ฅ, ํ์ต ๊ณต์ ํ ๊ธ
- ๐ ์ฝ๋ ์์ฑ: ํ์ฌ ์ค์ โ ๋ณต์ฌ ๊ฐ๋ฅํ JS ์ฝ๋ ์๋ ์์ฑ
- ํ๋จ ๊ณตํต: ํ ์คํธ ์คํ (Firebase ์์ด ๋ก์ปฌ), ์ค์ ์ ์ฅ/๋ถ๋ฌ์ค๊ธฐ (LocalStorage), ์ด๊ธฐํ
์์ ๊ตฌ์ญ ํต๊ณ ์ต๊ทผ 100ํ๋ก ์ ํ
- buildStatCache() ์์ ๊ตฌ์ญ ๊ณ์ฐ ๋ฒ์ ์ ํ
- ์ ์ฒด ์ด๋ ฅ ์ฌ์ฉ โ ์ต๊ทผ 100ํ๋ง ์ฌ์ฉ
- ์ค๋๋ ํจํด(์๋ ์ ) ์ํฅ๋ ฅ ๋ฐฐ์ , ์ต๊ทผ ํธ๋ ๋ ๋ฐ์
- zoneFreq, zoneGap ๊ณ์ฐ์ ์ ์ฉ
- ํจ๊ณผ: ๋์ฑ ๊ท ๋ฑํ ํ๋ฅ ๋ถํฌ, ์๋๋ณ ํธ๋ ๋ ๋ณํ ์ ์
๐ฅ Firebase ๋ธ๋ ๋ฉ ๊ตฌ์กฐ ๊ทผ๋ณธ ์์ (๋์ ๊ณ ์ฐฉ ํด๊ฒฐ)
๋ฌธ์ ๋ฐ๊ฒฌ
- Firebase ๋ธ๋ ๋ฉ์ด ML ํ์ต ํ์ ์ ์ฉ๋์ด ์ ํ์ต ๋ฌด์๋จ
- ์ด์ ํ๋ฅ 70% + ์ ํ์ต 30% = ๊ณผ๊ฑฐ ํ์ต์ด ๊ณ์ ๋์ ๊ณ ์ฐฉ
- 3, 6, 12, 16, 38, 40์ด ํ๋ฒ ๋์์ง๋ฉด ์๊ตฌ ๊ณ ์ ๋๋ ์ ์ํ
๊ตฌ์กฐ ์์
- Firebase ๋ธ๋ ๋ฉ์ ML ํ์ต ์ ์ผ๋ก ์ด๋
- ์๋ ์๋๋๋ก sin/cos ์ด๊ธฐ๊ฐ ์กฐ์ ๋ชฉ์ ์ผ๋ก๋ง ์ฌ์ฉ
- ์ด์ ํ์ต โ ML ํ์ต โ StatCache ๋ธ๋ ๋ฉ โ ์ ๊ทํ ์์๋ก ๋ณ๊ฒฝ
ํจ๊ณผ
- ๋งค ์คํ๋ง๋ค ๊ณผ๊ฑฐ ๋ฐ์ดํฐ๋ก ์๋กญ๊ฒ ํ์ต
- ๋์ ํธํฅ ์ ๊ฑฐ
- ํ๋ฅ ๋ถํฌ ๊ท ๋ฑํ
4์ค ๋ฒํธ ์ ๋ฆผ ๋ฐฉ์ง ๊ฐํ
โ ํ๋ฅ ์ ๊ทํ ๊ฐํ
- ์ต์๊ฐ์ ํ๊ท ์ 30% ์ด์์ผ๋ก ๋ณด์ฅ
- ๊ทน๋จ์ ์ผ๋ก ๋ฎ์ ํ๋ฅ (0.005 ์ดํ) ๋ฐฉ์ง
- ํ์ ๋ฒํธ ๊ธฐํ ํ๋
โก statWeight ๊ธฐ๋ณธ๊ฐ ์กฐ์
- 0.35 โ 0.15 (ML ๋น์ค ์ฆ๊ฐ)
- ๊ณผ๊ฑฐ ๋ฐ์ดํฐ ๊ณผ์ ํฉ ๋ฐฉ์ง
โข ๋งค 10๋ผ์ด๋๋ง๋ค ํ๋ฅ ์ฌ๋ถ๋ฐฐ
- ์์ 50๊ฐ ์กฐํฉ์์ 5ํ ์ด์ ๋ฑ์ฅํ ๋ฒํธ ํ๋ฅ 10% ๊ฐ์
- ํ ๋ฒ๋ ๋ฑ์ฅํ์ง ์์ ๋ฒํธ ํ๋ฅ 10% ์ฆ๊ฐ
- ํน์ ๋ฒํธ ๊ณ ์ฐฉ ๋ฐฉ์ง, ๋ค์ํ ๋ฒํธ ํ์ ์ ๋
โฃ ํ๋ณด ์์ฑ ์ ์์ ๋๋ค ๊ฐ์ ํฌํจ
- ๊ฐ ํ๋ณด๋ง๋ค 0~1๊ฐ ๋ฒํธ๋ฅผ ํ๋ฅ ๋ฌด์ํ๊ณ ์์ ๋๋ค ์ ํ
- ์์ ๋ฒํธ๋ง ์ ํ๋๋ ํจํด ์ฐจ๋จ
- ๋ค์์ฑ ํ๋ณด
๋ฒํธ ์ ๋ฆผ ๋ฐฉ์ง ๊ฐํ + ๊ธฐ๋น์ฒจ ์์ ์ผ์น ์ ์ธ
โ evolveHybridCube() โ ๋๋ค ๊ฐ์ค์น(0.95~1.05) ์ ์ฉ
- ๊ธฐ์กด ๊ณ ์ ๊ฐ ๋์
randomBoost = 0.95 + Math.random() * 0.10์์ฑ - ํน์ ๋ฒํธ ๊ณ ์ฐฉ ๋ฐฉ์ง
- ๋ค์์ฑ ์ฆ๊ฐ
โก ์ต์ข ์ถ์ฒ ์กฐํฉ ์ ์ ์ historySet.has() ์ฒดํฌ ์ถ๊ฐ
- 6๊ฐ ๋ฒํธ๊ฐ ๊ธฐ๋น์ฒจ ์ด๋ ฅ๊ณผ ์์ ์ผ์นํ๋ฉด ํด๋น ์กฐํฉ ์คํต
- ์ค์ ํ์ฉ ๊ฐ๋ฅํ ์๋ก์ด ์กฐํฉ๋ง ์ถ์ฒ
๋ฒํธ ์ ๋ฆผ ๋ฒ๊ทธ ์์
๋ฌธ์ ์์ธ
- ๋งค ๋ผ์ด๋ ์์ ์กฐํฉ์ ร1.05 ์ ์ฉ
- 50๋ผ์ด๋ ๋์ ์ ํน์ ๋ฒํธ ๊ณ ์ฐฉ
์์ ๋ด์ฉ
- ๋ผ์ด๋๋ณ probMap ๋์ ๊ฐฑ์ ๋ธ๋ก ์์ ์ ๊ฑฐ
- probMap์ ML + StatCache + ๋ณด๋์ค ํ์ต์ผ๋ก๋ง ๊ตฌ์ฑ
colorZone + bonusHistory ํ์ต ๊ธฐ๋ฅ ์ถ๊ฐ
โ buildStatCache() โ ์์ ๊ตฌ์ญ๋ณ ๋น๋/๊ฐ๊ฒฉ ์ถ๊ฐ
- ํฉ(1
10) / ์ฒญ(1120) / ์ (2130) / ํ(3140) / ๋ น(41~45)
โก buildWeightedProb() โ bonusHistory ๋ณด๋์ค ๋ฒํธ ํ์ต
- bonusWeight ์ต์ (๊ธฐ๋ณธ 0.15)
โข scoreCombo() โ colorZoneWeight ์์ ๊ท ํ ์ ์ ์ถ๊ฐ
- ๊ธฐ๋ณธ๊ฐ 0.20
โฃ DEFAULTS ์ถ๊ฐ
bonusHistory: nullbonusWeight: 0.15colorZoneWeight: 0.20
index.html ๋์๋ณด๋ ๊ฐ์
โ poolSize ์ฌ๋ผ์ด๋ ์ถ๊ฐ
- 100~10,000 ๋ฒ์, 100 ๋จ์ ์กฐ์ ๊ฐ๋ฅ
โก ๋ก๋ ์น ๋น์ฒจ ํ์คํ ๋ฆฌ ์ฐ๋
- lotto_history/lotto645_historyโdraws ์ค์ ๋ก๋ ํ ์์ง์ ์ ๋ฌ
โข ์คํ ์ ๋จ๊ณ๋ณ ์ํ ํ์
- "๋น์ฒจ ๋ฐ์ดํฐ ๋ก๋ฉ ์ค" โ "ํ์ต ์ํ ๋ก๋ฉ ์ค" โ "์์ง ์คํ" ์์ผ๋ก ๋ช ํํ
โฃ path-box์ ๋น์ฒจ ํ์คํ ๋ฆฌ ๊ฒฝ๋ก/์ํ ํ ์ถ๊ฐ
- ์ด๊ธฐ ๋ก๋ ์ ํ์ฐจ์ ์ฌ์ ํ์ธ
โค renderStat โ numbers ๋ฐฐ์ด/2D ๋ฐฐ์ด ์์ชฝ ํํ ๋ชจ๋ ์์ฉ
cube-engine.js ์ฃผ์ ์ ๊ทธ๋ ์ด๋
โ buildStatCache() ์ถ๊ฐ
- freq / recentFreq / gap / reHit ์ฌ์ ๊ณ์ฐ
โก buildWeightedProb() ์ถ๊ฐ
- ํต๊ณ ๊ธฐ๋ฐ ํ๋ฅ ๋ ์ด์ด
- statWeight ์ต์ (๊ธฐ๋ณธ 0.35)
โข historySet O(1) ๋์
- isTooSimilar O(N) โ O(1) ๋์ฒด
- ํ๋ณด ์์ฑ ์๋ ํฅ์
โฃ onProgress stats ํ์ฅ
- scoreHistory, probMap, topItems, cubeResults ์ค์๊ฐ ์ ๋ฌ
โค onRound ์๊ทธ๋์ฒ ๋ณ๊ฒฝ
- 3๋ฒ์งธ ์ธ์ scoreHistory ์ถ๊ฐ
โฅ result ํ๋ ์ถ๊ฐ
- scoreHistory, stat
โฆ index.html ํ์ต ์ํ ๋ชจ๋ํฐ๋ง ๋์๋ณด๋๋ก ์ ๋ฉด ๊ฐํธ
โง meta.version ํ๋ ์ถ๊ฐ
โจ DEFAULTS ์ถ๊ฐ
statWeight: 0.35recentWindow: 30
์งํ ๋ฃจํ ์ต์ ํ
- ์ ์ ์ฃผ๊ธฐ 1000 โ 100์ผ๋ก ๋จ์ถ
- topCandidatePool ํ๋ผ๋ฏธํฐ ์ถ๊ฐ
๊ตฌ์กฐ ๊ฐํธ
- ๋ฒ์ ์ค์ (rangeStart/End)
- ์ ์ธ์ซ์ (excludeNumbers)
- Firebase ์ฐ๋
- ์ ์ํ ํ์ต๋ฅ
- ๋ผ์ด๋๋ณ probMap ๋์ ๊ฐฑ์
- ๊ธฐ๋ณธ๊ฐ ์ถ๊ฐ ์กฐ์
- ๊ธฐ๋ณธ๊ฐ ์ถ๊ฐ ์กฐ์
- ๊ธฐ๋ณธ๊ฐ ๋ณ๊ฒฝ: evolveTime 150, loopMin 5000, poolSize 3000
- reportProgress ํ์ด๋ฐ ์์
- ๋ผ์ด๋ ์๋ฃ ํ ์ฆ์ ๋ฐ์
- ์ต์ด ๋ฆด๋ฆฌ์ฆ
- ๋ฒ์ฉํ, ํ๋ฆฌ์ , ์ฝ๋ฐฑ
- CommonJS/๋ธ๋ผ์ฐ์ ์ง์
UI ๊ฐ์ํ + Firebase ์ฐ๊ฒฐ ์ฒดํฌ + Pool Size ์ฌ๋ผ์ด๋ ๊ฐ์
โ ์ํ ๋ถ๋ฌ์ค๊ธฐ ๋ฒํผ ์ ๊ฑฐ
โก ์ด๊ธฐํ ๋ฒํผ ์ ๊ฑฐ
โข Firebase ์ฐ๊ฒฐ ์ฌ์ ์ฒดํฌ ์ถ๊ฐ
- ์ฐ๊ฒฐ ์คํจ ์ "Database์ ์ฐ๊ฒฐ์ด ์๋ผ ํ ์คํธ๊ฐ ๋ถ๊ฐ๋ฅ ํฉ๋๋ค" ์๋ฆผ
โฃ Pool Size ์ฌ๋ผ์ด๋ ์๋ ๋นํ์ฑํ
- ํ์ต ์์ ์ disabled, ์๋ฃ/์ค๋ฅ ์ ์ฌํ์ฑํ
- disabled ์คํ์ผ: opacity 50% + cursor:not-allowed
zerojat7-ui License
GitHub Issues๋ฅผ ํตํด ๋ฒ๊ทธ ๋ฆฌํฌํธ ๋ฐ ๊ธฐ๋ฅ ์ ์์ ๋จ๊ฒจ์ฃผ์ธ์.