// 增强随机数生成器 // 实现更真实的概率分布,提升易经金钱卦的准确性 const crypto = require('crypto'); class EnhancedRandom { constructor() { // 初始化种子池 this.seedPool = []; this.poolSize = 256; this.currentIndex = 0; // 初始化熵源 this.initializeEntropyPool(); // 金钱卦的真实概率分布(基于传统投掷硬币的物理特性) this.coinProbabilities = { // 考虑硬币的物理特性,正面略重于反面 heads: 0.501, // 正面(阳) tails: 0.499 // 反面(阴) }; // 六爻概率分布(基于传统易学理论) this.yaoDistribution = { oldYin: 0.125, // 老阴(6)- 变阳 youngYang: 0.375, // 少阳(7) youngYin: 0.375, // 少阴(8) oldYang: 0.125 // 老阳(9)- 变阴 }; } // 初始化熵源池 initializeEntropyPool() { // 使用多种熵源 const sources = [ Date.now(), process.hrtime.bigint(), Math.random() * 1000000, process.pid, process.uptime() * 1000 ]; // 生成高质量随机种子池 for (let i = 0; i < this.poolSize; i++) { const entropy = sources.reduce((acc, source, index) => { return acc ^ (typeof source === 'bigint' ? Number(source) : source) * (i + index + 1); }, 0); // 使用crypto模块增强随机性 const cryptoBytes = crypto.randomBytes(4); const cryptoValue = cryptoBytes.readUInt32BE(0); this.seedPool[i] = (entropy ^ cryptoValue) % 2147483647; } } // 获取高质量随机数(0-1之间) getHighQualityRandom() { // 使用线性同余生成器改进版 const a = 1664525; const c = 1013904223; const m = 2147483647; this.currentIndex = (this.currentIndex + 1) % this.poolSize; this.seedPool[this.currentIndex] = (a * this.seedPool[this.currentIndex] + c) % m; // 结合crypto随机数提高质量 const cryptoRandom = crypto.randomBytes(4).readUInt32BE(0) / 4294967295; const poolRandom = this.seedPool[this.currentIndex] / m; // 使用XOR混合提高随机性 return (poolRandom + cryptoRandom) / 2; } // 模拟真实硬币投掷 simulateRealCoinToss() { const random = this.getHighQualityRandom(); // 考虑硬币的物理特性和投掷环境 const environmentFactor = this.getEnvironmentFactor(); const adjustedProbability = this.coinProbabilities.heads + environmentFactor; return random < adjustedProbability ? 3 : 2; // 3=正面(阳), 2=反面(阴) } // 获取环境因子(模拟真实投掷环境的微小变化) getEnvironmentFactor() { const time = Date.now(); const microFactor = (time % 1000) / 100000; // 微小的时间因子 const randomFactor = (this.getHighQualityRandom() - 0.5) / 1000; // 微小的随机因子 return (microFactor + randomFactor) * 0.001; // 很小的调整因子 } // 生成金钱卦的一爻 generateCoinYao() { // 投掷三枚硬币 const coin1 = this.simulateRealCoinToss(); const coin2 = this.simulateRealCoinToss(); const coin3 = this.simulateRealCoinToss(); const sum = coin1 + coin2 + coin3; // 根据总和确定爻的性质 switch (sum) { case 6: return { value: 0, type: 'oldYin', changing: true, description: '老阴,变阳' }; case 7: return { value: 1, type: 'youngYang', changing: false, description: '少阳' }; case 8: return { value: 0, type: 'youngYin', changing: false, description: '少阴' }; case 9: return { value: 1, type: 'oldYang', changing: true, description: '老阳,变阴' }; default: return { value: 1, type: 'youngYang', changing: false, description: '少阳' }; } } // 生成完整的六爻卦象 generateFullHexagram() { const lines = []; const changingLines = []; for (let i = 0; i < 6; i++) { const yao = this.generateCoinYao(); lines.push(yao.value); if (yao.changing) { changingLines.push(i + 1); // 爻位从1开始计数 } } return { lines: lines, changingLines: changingLines, binary: lines.join(''), method: '增强金钱卦法', quality: this.assessRandomQuality() }; } // 使用正态分布生成随机数 generateNormalRandom(mean = 0, stdDev = 1) { // Box-Muller变换生成正态分布 if (this.spare !== undefined) { const tmp = this.spare; delete this.spare; return tmp * stdDev + mean; } const u1 = this.getHighQualityRandom(); const u2 = this.getHighQualityRandom(); const mag = stdDev * Math.sqrt(-2.0 * Math.log(u1)); const z0 = mag * Math.cos(2.0 * Math.PI * u2) + mean; const z1 = mag * Math.sin(2.0 * Math.PI * u2) + mean; this.spare = z1; return z0; } // 基于时间和用户因素的个性化随机数 generatePersonalizedRandom(userId, question) { // 基于用户ID和问题生成个性化种子 const userSeed = this.hashString(userId || 'anonymous'); const questionSeed = this.hashString(question || 'general'); const timeSeed = Date.now() % 86400000; // 一天内的毫秒数 // 组合种子 const combinedSeed = (userSeed ^ questionSeed ^ timeSeed) % 2147483647; // 临时调整种子池 const originalSeed = this.seedPool[this.currentIndex]; this.seedPool[this.currentIndex] = combinedSeed; const result = this.getHighQualityRandom(); // 恢复原始种子 this.seedPool[this.currentIndex] = originalSeed; return result; } // 字符串哈希函数 hashString(str) { let hash = 0; for (let i = 0; i < str.length; i++) { const char = str.charCodeAt(i); hash = ((hash << 5) - hash) + char; hash = hash & hash; // 转换为32位整数 } return Math.abs(hash); } // 评估随机数质量 assessRandomQuality() { const samples = []; for (let i = 0; i < 100; i++) { samples.push(this.getHighQualityRandom()); } // 计算均值和方差 const mean = samples.reduce((a, b) => a + b) / samples.length; const variance = samples.reduce((acc, val) => acc + Math.pow(val - mean, 2), 0) / samples.length; // 评估质量 const meanQuality = Math.abs(mean - 0.5) < 0.05 ? 'good' : 'fair'; const varianceQuality = variance > 0.08 && variance < 0.12 ? 'good' : 'fair'; return { overall: meanQuality === 'good' && varianceQuality === 'good' ? 'excellent' : 'good', mean: mean, variance: variance, samples: samples.length }; } // 重新初始化熵源(定期调用以保持随机性) refreshEntropyPool() { this.initializeEntropyPool(); } // 获取随机数生成器统计信息 getStatistics() { return { poolSize: this.poolSize, currentIndex: this.currentIndex, coinProbabilities: this.coinProbabilities, yaoDistribution: this.yaoDistribution, quality: this.assessRandomQuality() }; } } module.exports = EnhancedRandom;