代码拉取完成,页面将自动刷新
#!/usr/bin/env node
const fs = require('fs');
const readline = require('readline');
function calculateEntropy(probabilities) {
let sum = 0;
for (let p of probabilities) {
if (p < 0) {
throw new Error('请输入大于0的数');
}else if(p > 1){
throw new Error('请输入小于1的数');
}
sum += p;
}
if (sum > 1) {
throw new Error('概率空间不封闭,概率和大于1');
}else if(sum <1){
throw new Error('概率空间不封闭,概率和小于1');
}
return -probabilities.reduce((acc, p) => acc + p * Math.log2(p), 0);
}
function parseProbabilities(input) {
const separators = [',', ' '];
let separator = null;
let trimmedInput = input.trim();
if (trimmedInput.includes(',') && trimmedInput.includes(' ')) {
throw new Error('请输入正确数字!');
}
// 查找分隔符
for (let sep of separators) {
if (trimmedInput.includes(sep)) {
separator = sep;
break;
}
}
// 使用找到的分隔符分割字符串,并尝试将每个部分转换为数字
const parts = trimmedInput.split(separator);
const probabilities = parts.map(p => {
const num = Number(p);
if (!Number.isFinite(num)) {
throw new Error('请输入有效的数字!');
}
return num;
});
if (!separator && trimmedInput !== '') {
throw new Error('命令行参数错误: 概率数据少于两个!');
}
// 如果没有找到分隔符但输入为空,返回空数组
if (!separator && trimmedInput === '') {
return [];
}
// 返回转换后的概率数组
return probabilities;
}
function main() {
const args = process.argv.slice(2);
if (args.length === 0) {
// 交互输入
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question('请输入信源概率分布:(Ctrl+D退出输入) ', (input) => {
const probabilities = parseProbabilities(input);
const entropy = calculateEntropy(probabilities);
console.log(`Entropy: ${entropy.toFixed(4)} bits`);
}
);
} else {
try {
const probabilities = parseProbabilities(args.join(','));
const entropy = calculateEntropy(probabilities);
console.log(`Entropy: ${entropy.toFixed(4)} bits`);
} catch (error) {
console.error(error.message);
}
}
}
main();
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。