94 lines
3.5 KiB
JavaScript
94 lines
3.5 KiB
JavaScript
/**
|
||
* 马尔可夫链分析 - 分析位置之间的转移概率
|
||
*/
|
||
|
||
// 70张成功卡号
|
||
const fullCards = [
|
||
// 原始16张
|
||
'6228367545055812', '6228367548774419', '6228367546781457', '6228367542738949',
|
||
'6228367542602400', '6228367548575105', '6228367546496080', '6228367540057649',
|
||
'6228367549574719', '6228367548435128', '6228367542797374', '6228367545956423',
|
||
'6228367547237848', '6228367540385107', '6228367544252006', '6228367547562054',
|
||
// 今天54张
|
||
'6228367541130577', '6228367540744030', '6228367549888788', '6228367549131205',
|
||
'6228367541450744', '6228367547238010', '6228367547300364', '6228367540814288',
|
||
'6228367546042579', '6228367546361755', '6228367542443235', '6228367543564435',
|
||
'6228367548400627', '6228367544445204', '6228367542653734', '6228367549976732',
|
||
'6228367540810302', '6228367540707201', '6228367545237808', '6228367544322734',
|
||
'6228367541880148', '6228367549130520', '6228367547863197', '6228367541210049',
|
||
'6228367549031561', '6228367542464926', '6228367542487000', '6228367545452860',
|
||
'6228367548491592', '6228367545022853', '6228367545864858', '6228367544742832',
|
||
'6228367540023658', '6228367547416988', '6228367547093159', '6228367549198576',
|
||
'6228367548160064', '6228367546223252', '6228367544873785', '6228367541299976',
|
||
'6228367542940032', '6228367546998937', '6228367545800241', '6228367543770784',
|
||
'6228367545976843', '6228367547542551', '6228367543917914', '6228367545657930',
|
||
'6228367586381796', '6228367544322809', '6228367549131254', '6228367543917146',
|
||
'6228367546998903', '6228367545864460'
|
||
];
|
||
|
||
// 提取后3位(不含校验位)
|
||
const patterns = fullCards.map(card => card.slice(-4, -1));
|
||
|
||
console.log('=== 马尔可夫链分析:位置转移概率 ===\n');
|
||
|
||
// 统计转移概率:百位 -> 十位
|
||
const transitions = {};
|
||
|
||
patterns.forEach(p => {
|
||
const d1 = p[0]; // 百位
|
||
const d2 = p[1]; // 十位
|
||
|
||
if (!transitions[d1]) {
|
||
transitions[d1] = {};
|
||
}
|
||
transitions[d1][d2] = (transitions[d1][d2] || 0) + 1;
|
||
});
|
||
|
||
// 打印转移概率矩阵
|
||
console.log('百位 -> 十位 转移概率:\n');
|
||
for (let i = 0; i <= 9; i++) {
|
||
if (!transitions[i]) continue;
|
||
|
||
const total = Object.values(transitions[i]).reduce((sum, count) => sum + count, 0);
|
||
console.log(`百位=${i} (${total}次):`);
|
||
|
||
const sorted = Object.entries(transitions[i])
|
||
.sort((a, b) => b[1] - a[1])
|
||
.slice(0, 5); // 只显示前5个最高概率
|
||
|
||
sorted.forEach(([digit, count]) => {
|
||
const prob = (count / total * 100).toFixed(1);
|
||
console.log(` -> ${digit}: ${count}次 (${prob}%)`);
|
||
});
|
||
console.log();
|
||
}
|
||
|
||
// 生成转移概率配置
|
||
console.log('\n=== 生成马尔可夫转移配置 ===\n');
|
||
console.log('const markovTransitions = {');
|
||
for (let i = 0; i <= 9; i++) {
|
||
if (!transitions[i]) {
|
||
console.log(` '${i}': [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], // 无数据,均匀分布`);
|
||
continue;
|
||
}
|
||
|
||
const weights = Array.from({length: 10}, (_, j) => transitions[i][j] || 0);
|
||
console.log(` '${i}': [${weights.join(', ')}],`);
|
||
}
|
||
console.log('};');
|
||
|
||
// 分析是否有明显的模式
|
||
console.log('\n=== 关键发现 ===\n');
|
||
for (let i = 0; i <= 9; i++) {
|
||
if (!transitions[i]) continue;
|
||
|
||
const total = Object.values(transitions[i]).reduce((sum, count) => sum + count, 0);
|
||
const max = Math.max(...Object.values(transitions[i]));
|
||
const maxDigit = Object.entries(transitions[i]).find(([_, count]) => count === max)[0];
|
||
const maxProb = (max / total * 100).toFixed(1);
|
||
|
||
if (maxProb > 25) {
|
||
console.log(`⚠️ 百位=${i} 时,十位=${maxDigit} 的概率高达 ${maxProb}%`);
|
||
}
|
||
}
|