================================================================================ 六式监测 1.0.3 · 完整规则说明书(可复刻版) ================================================================================ 用途:把本文档交给开发者/AI,应能独立复刻出功能等价的「六式监测」客户端。 技术栈参考:C# WinForms · .NET Framework 4.x · 单文件 LayoutShell.cs 可编译为 exe 免责声明:全部为历史频率/概率统计,不保证、不声称能预测下一期开奖。 -------------------------------------------------------------------------------- 0. 产品定位 -------------------------------------------------------------------------------- 名称:六式监测 版本:1.0.1 → 曾扩展算法,当前功能规格以 1.0.3 为准 玩法:极速赛车(PK10 / lottery_code=PK10JSC) 核心:按「经营日开奖列表」对各名次号码打分排序;顶部可选 12 种算法;码 N 截取前 N。 禁止依赖:不以「号码 A/B(上期/当期配对)」调用 session-ball-stats 作为主统计路径。 窗口标题:六式监测 1.0.3 客户区默认:948 × 680,最小 948 × 560 输出文件:六式监测.exe 启动脚本:启动.bat(若无 exe 则调用 编译并启动.bat) -------------------------------------------------------------------------------- 1. 数据约定与编号 -------------------------------------------------------------------------------- 1.1 一期开奖 - 一期包含 10 个名次,号码取值 1~10,各不相同(排列)。 - 内部一律用真实号码 1~10 计算。 - 界面显示规则「10→0」: · 左侧结果网格、查询结果框、号码列:10 显示为字符 "0" · 顶部彩色开奖球:仍显示 "10" - 若用户输入 "0",解析为号码 10。 1.2 名次与行下标映射 UI「位置」标签顺序:1,2,3,4,5,6,7,8,9,0 对应数组下标 position:0,1,2,3,4,5,6,7,8,9 即:标签「位置1」→ Balls[0],标签「位置0」→ Balls[9] 1.3 开奖列表顺序 拉取后列表 draws[]: draws[0] = 最新一期 draws[1] = 上一期 draws[i] = 越来越旧 统计与转移均按此顺序。 1.4 经营日(session day) - 当天 07:00:00 起算新经营日;07:00 前仍属「昨天」经营日。 - GetSessionBusinessDate(): if (Now.Hour < 7) return Today.AddDays(-1); else return Today; - 统计用日期 GetStatsDateIso(): 取日期控件的日期;若当前 Hour<7 且控件选的是「今天」,强制改为经营日(昨天)并回写控件。 格式:yyyy-MM-dd - 网站日期过滤格式:yyyy/MM/dd -------------------------------------------------------------------------------- 2. 外部接口 -------------------------------------------------------------------------------- 2.1 实时最新开奖(轮询) URL: https://api.api68.com/pks/getLotteryPksInfo.do?lotCode=10037 方法: GET 间隔: 约 100ms(扣除请求耗时后 sleep,至少 1ms) 解析字段(JSON): preDrawIssue → 期号 preDrawCode → 开奖号串,逗号/空格分隔 10 个号码 preDrawTime → 开奖时间 drawTime → 下次开奖时间 用途:顶部期号、彩球、倒计时、状态栏;新期号变化时刷新统计。 2.2 开奖列表(统计主数据源) URL 模板: http://198.44.178.56:5080/api/usage/draws ?admin_token=hmjc-admin-2026 &lottery=PK10JSC &lottery_code=PK10JSC &day_mode=session &source=feed &date={yyyy-MM-dd} &page_size=200 &page={1..pages} 分页:读取 JSON 中 pages,逐页拉满(上限约 30 页)。 解析每条: draw_number → 期号 numbers_json → 形如 "[8, 6, 10, 9, 7, 5, 4, 2, 1, 3]"(可能含转义) 得到 List{ Issue, Balls[10] } 2.3 种子历史(启动时,用于号码列展示等) 可用同一 draws API(page_size 可较小),保留最近 HistoryKeep=40 期到内存 _history。 注意:算法打分用的是「全日分页拉齐」的列表,不是仅 40 期。 2.4 个人数据后台(网页) URL: http://198.44.178.56:5080/draws?admin_token=hmjc-admin-2026 用 WinForms WebBrowser 独立窗口打开;可把日期注入 #dateFilter。 需尝试注册 FEATURE_BROWSER_EMULATION=11001(IE11)以免页面脚本异常。 -------------------------------------------------------------------------------- 3. 界面结构(必须对齐) -------------------------------------------------------------------------------- 3.1 顶栏(单行,总宽适配 948) 玩法下拉(仅「极速赛车」) 刷新 → 重拉列表并按当前算法重算 个人数据后台 自动刷新(勾选框,默认勾选;轮询线程始终按设计跑,勾选可作预留) 设置 码(全局 N,默认 "5",范围 1~10)→ 失焦/回车/合法变更时同步到 10 行「码」并刷新 规则 → 弹窗说明 概率分析 → 独立窗体 算法下拉(十二选一,见第 5 节) 3.2 主体上部 绿色「保存」按钮(布局占位,可无持久化逻辑) 最新期号标签 + 10 个彩球(自定义绘制) 倒计时「X秒后」 日期选择器(经营日) 3.3 规则提示条 文案模板:当前算法:{名称} · 数据=开奖列表 · 码N取前N · 10→0 · 详见「规则」 3.4 左侧:10×10 DataGridView - 无表头、无行头,单元格 42×42,只读 - 每行 = 一个名次(行0=位置1 … 行9=位置0) - 每列 = 该算法排序后的第 1~10 名号码(显示用 FormatGridBall,10→0) - 无数据时显示 "--" 3.5 右侧:GroupBox「查询条件」 10 行,每行: 位置[只读框] · 号码[可显示当期] · 码[与全局同步] · 结果[只读] 布局尺寸参考(保持紧凑,勿无大块右侧空白): 客户区宽 948;查询 GroupBox 宽约 498;结果框宽约 88 号码列: 内容 = 该名次当期开奖(FormatGridBall) 设置可「只隐藏内容、保留控件位置」(默认显示内容) 结果框: 默认不显示百分比,仅拼接号码,如码=5 → "41673" 若开启概率%:如 "4(11%) 1(11%) …"(权重占比四舍五入为整数%) 悬停 ToolTip:列出该名次全部号码的权重与占比明细 3.6 状态栏 左:同步状态、最新期号、开奖/下次时间、倒计时秒数 右:当前算法简称 · 列表样本期数 · 或延迟 ms 3.7 设置(ui_settings.txt,UTF-8) show_number=0|1 默认 1 show_prob=0|1 默认 0 路径:exe 同目录 -------------------------------------------------------------------------------- 4. 主计算流程(每次刷新) -------------------------------------------------------------------------------- 输入: dateIso = GetStatsDateIso() algo = 算法下拉 SelectedIndex(0~11) codeN = 全局码(1~10) latestNums[10] = 各行号码列展示用字符串(不参与打分) 步骤: 1) draws = FetchSessionDraws(dateIso) // 全日列表,newest-first 2) sampleSize = draws.Count 3) allPosFreq[10][11]:对每个 position、每个球 k=1..10 计数出现次数 4) 对 row=0..9: RankByAlgorithm(draws, allPosFreq, row, algo, codeN → ranked[10], weights[10]) 结果文本 = FormatResultText(ranked, weights, take=codeN, showProb) 左侧网格该行 = FormatGridBall(ranked[c]) for c=0..9 5) 缓存 ranked/weights 供「概率分析」窗使用 排序公共规则(所有算法最后都走): - 按 score[k] 降序;同分则号码 k 升序 - rankedCounts[i] = Round(score[ranked[i]]),负数夹为 0 - 若所有权重和为 0:回退为该名次古典频次 freq[k] -------------------------------------------------------------------------------- 5. 十二种算法(SelectedIndex ↔ 名称 ↔ 精确打分) -------------------------------------------------------------------------------- 索引从 0 开始。k 遍历号码 1..10。n = draws.Count。 freq[k] = 该名次在全部样本中号码 k 的出现次数。 position = 行下标 0..9。 【0】古典计数(下拉显示「1.古典计数」) score[k] = freq[k] 含义:热号优先;P(k)=freq[k]/n(展示用) 【1】对立事件(「2.对立事件」) missStreak[k] = 从 draws[0] 起第一次出现 k 的下标 i;若从未出现则为 n score[k] = (n - freq[k]) + missStreak[k] 含义:少出 + 当前未出间隔,冷号优先 【2】并事件加减(「3.并事件加减」) left = position>0 ? position-1 : 9 right = position<9 ? position+1 : 0 对每一期 i:若 k 出现在 Balls[position] 或 Balls[left] 或 Balls[right],unionHits++ score[k] = unionHits 若 n==0 退化:用频次容斥近似 max(0, f+fL+fR - min(f,fL) - min(f,fR)) 【3】条件乘法(「4.条件乘法」)一阶马尔可夫 given = draws[0].Balls[position] // 最新一期该名次 对 i=0..n-2: older = draws[i+1], newer = draws[i] 若 older[position]==given 且 newer[position]∈[1,10]:nextCnt[newer]++ 若 hit>0:score[k]=nextCnt[k] 否则:score[k]=freq[k](回退古典) 含义:P(下一码 | 上期该名次=given) 【4】全概率贝叶斯(「5.全概率贝叶斯」) 先验 prior[k]: 对其他 9 个名次 p≠position,累加 allPosFreq[p][k],再 /9 /n 若 <1e-9 则 prior[k]=0.1 再对 k=1..10 归一化使 Σ prior=1 似然 like[k] = (freq[k] + 0.5) / (n + 10*0.5) // Laplace eps=0.5 post[k] = prior[k] * like[k] 归一化后 score[k] = post[k]/Σpost * 1000 【5】二项分布(「6.二项分布」) m = max(1, codeN) p = n>0 ? freq[k]/n : 0.1,夹到 [0,1] score[k] = (1 - (1-p)^m) * 1000 含义:未来 m 期内至少出现一次的近似概率 【6】滑动窗口(「7.滑动窗口」) W = codeN<1 ? 30 : codeN*15 W = max(W, 30);W = min(W, n) 只扫描 draws[0..W-1],score[v] += 1(v 为该名次号码) 含义:近况热度;码=5 → W=75 【7】指数衰减(「8.指数衰减」) λ = 0.96 w=1;对 i=0..n-1: 若该期该名次为 v:score[v] += w w *= λ;若 w<1e-12 停止 最后 score[k] *= 1000 含义:越近期权重越大 【8】遗漏值(「9.遗漏值」) 对每个 k: miss = 当前连错(首次命中的下标;未见则为 n) maxGap = 历史最大间隔(两次出现之间的间隙期数;从未出现则 n) score[k] = miss * 1000 + maxGap 含义:当前遗漏为主,最大间隔为辅 【9】二阶马尔可夫(「10.二阶马尔可夫」) g0 = draws[0].Balls[position] // 最新 g1 = draws[1].Balls[position] // 上一期 对 i=0..n-3: newer=draws[i], mid=draws[i+1], older=draws[i+2] 若 mid[position]==g0 且 older[position]==g1: nextCnt[newer[position]]++ 若 hit>0:score=nextCnt 否则回退一阶(同算法【3】,仅用 g0) 再否则回退古典 freq 含义:P(下一 | 上两期=(g1,g0)) 用于推断「当前状态之后」历史曾出现的下一码分布 【10】卡方偏离(「11.卡方偏离」) expected e = n/10.0(若过小则 1) diff = freq[k] - e chi = diff² / e score[k] = diff>=0 ? (1000+chi) : (1000-chi) 含义:相对均匀 p=0.1,过热优先 【11】威尔逊下界(「12.威尔逊下界」) z=1.96,z2=z²,p=freq[k]/n(n<=0 则 score=0) denom = 1 + z2/n centre = p + z2/(2n) margin = z * sqrt( (p(1-p) + z2/(4n)) / n ) lower = (centre - margin) / denom;若 <0 则 0 score[k] = lower * 10000 含义:约 95% 置信下界,样本少更稳,仍偏热号但更保守 -------------------------------------------------------------------------------- 6. 结果展示格式 -------------------------------------------------------------------------------- 6.1 默认(show_prob=0) 取 ranked 前 codeN 个,逐个 FormatGridBall 无分隔符拼接。 例:排名 [4,1,6,7,3,…] 码=5 → "41673" 若含 10:显示为 0,如 [10,4,1,7,8] → "04178" 6.2 百分比模式(show_prob=1) 空格分隔:FormatGridBall(k) + "(" + Round(weight/Σweight*100) + "%)" 例:"4(11%) 1(11%) 6(11%) 7(11%) 3(10%)" 6.3 网格 始终填满该行 10 格为完整排名(不只前 N);无则 "--" -------------------------------------------------------------------------------- 7. 「概率分析」独立窗(附加功能) -------------------------------------------------------------------------------- 数据:主窗缓存的各名次 ranked/counts(注意:weights 来自当前所选主算法打分, 面板内仍按「频次型」思路做全概率/贝叶斯合成——实现上把 counts 当权重)。 对每个名次 row=0..9: 由 ranked+counts 还原 byBall[k],total=Σcounts 若 total>0: pk = (byBall[k]+0.5)/(total+10*0.5) full[k] += pk bayes[k] *= pk // 先验初值 bayes[k]=1/10 used++ full[k] /= used bayes 再归一化 表格列:号码、名次1频率%、全概率%、贝叶斯后验%、全概率序、贝叶斯序 摘要:样本期数、有效名次、全概率 TopN、贝叶斯 TopN(N=码) -------------------------------------------------------------------------------- 8. 彩球颜色(顶部绘制,号码 0~10) -------------------------------------------------------------------------------- 背景: 0→紫(150,0,255) 1→黄 2→蓝(0,146,255) 3→深灰(77,77,77) 4→橙(255,115,0) 5→青(0,231,231) 6→紫蓝(82,52,255) 7→浅灰(191,191,191) 8→红 9→暗红(118,0,0) 10→绿(40,159,40) 前景:0,2,3,6,8,9,10 用白字;其余黑字。 -------------------------------------------------------------------------------- 9. 编译与打包 -------------------------------------------------------------------------------- csc /target:winexe /optimize+ /out:六式监测.exe /r:System.dll /r:System.Drawing.dll /r:System.Windows.Forms.dll LayoutShell.cs 发布包建议含:六式监测.exe、启动.bat、编译并启动.bat、LayoutShell.cs、ui_settings.txt 以及本规则说明书。 -------------------------------------------------------------------------------- 10. 验收清单(按本文复刻后应满足) -------------------------------------------------------------------------------- □ 窗口名含「六式监测」,客户区约 948 宽,右侧无大块无意义空白 □ 实时期号/彩球/倒计时可更新 □ 改日期或点刷新会重拉经营日列表并更新 10 行结果 □ 改「码」同步 10 行并截断结果长度=码 □ 算法 1~12 切换后结果明显可不同(尤其冷热类 vs 条件类) □ 10 显示为 0(球除外) □ 不用 A/B 配对接口做主结果 □ 设置可关号码内容、可开结果百分比 □ 概率分析窗能打开并显示全概率/贝叶斯表 □ 规则弹窗文字与十二算法一致 -------------------------------------------------------------------------------- 11. 给下次开发者的一句话摘要 -------------------------------------------------------------------------------- 「WinForms 客户端;经营日拉齐极速赛车开奖列表;对每个名次用 12 种打分算法 排出 1~10 号;码 N 取前 N 显示;10→0;实时源 api68;列表源 198.44.178.56:5080。」 ================================================================================ 文档结束 · 六式监测 1.0.3 ================================================================================