Skip to content

Instantly share code, notes, and snippets.

@Tsuk1ko
Last active April 21, 2024 13:36
Show Gist options
  • Save Tsuk1ko/21b2f74e9119e9fc0e2f01de815e17a5 to your computer and use it in GitHub Desktop.
Save Tsuk1ko/21b2f74e9119e9fc0e2f01de815e17a5 to your computer and use it in GitHub Desktop.
雷索纳斯砍价抬价期望疲劳计算

在当前页面按 F12 打开 devtool,把下面的代码粘贴到 console 里回车执行

function calc(config) {
  const SUCCESS_USE = 8;
  const FAILED_USE = Math.max(0, SUCCESS_USE - config.reduceGrowthWhenFailed);
  const EACH_SUCCESS_REDUCE_PROB = 0.1;
  const run = ({ totalCount, successCount, isLastFailed }) => {
    const curProb = Math.min(1, config.initProb + (totalCount === 0 ? config.fistTryAddProb : 0) - successCount * EACH_SUCCESS_REDUCE_PROB + (isLastFailed ? config.failedAddProb : 0));
    if (successCount >= config.successNumber || totalCount >= config.maxTry || curProb <= 0) {
      return successCount * SUCCESS_USE + (totalCount - successCount) * FAILED_USE;
    }
    return curProb * run({ totalCount: totalCount + 1, successCount: successCount + 1, isLastFailed: false }) + (curProb === 1 ? 0 : (1 - curProb) * run({ totalCount: totalCount + 1, successCount, isLastFailed: true }));
  };
  return run({ totalCount: 0, successCount: 0, isLastFailed: false });
}

然后执行以下函数计算

calc({
  // 需要成功次数
  successNumber: 2,
  // 砍抬次数上限
  maxTry: 7,
  // 初始成功率(游戏内看的要去除生活技能首次增加的成功率)
  initProb: 0.8,
  // 生活技能:首次议价增加成功率
  fistTryAddProb: 0,
  // 生活技能:失败时下一次增加成功率
  failedAddProb: 0.05,
  // 生活技能:议价失败时增加的疲劳值减少
  reduceGrowthWhenFailed: 1
})
interface Config {
successNumber: number;
maxTry: number;
initProb: number;
fistTryAddProb: number;
failedAddProb: number;
reduceGrowthWhenFailed: number;
}
interface State {
totalCount: number;
successCount: number;
isLastFailed: boolean;
}
function calc(config: Readonly<Config>) {
const SUCCESS_USE = 8;
const FAILED_USE = Math.max(0, SUCCESS_USE - config.reduceGrowthWhenFailed);
const EACH_SUCCESS_REDUCE_PROB = 0.1;
const run = ({ totalCount, successCount, isLastFailed }: State) => {
const curProb = Math.min(
1,
config.initProb +
(totalCount === 0 ? config.fistTryAddProb : 0) -
successCount * EACH_SUCCESS_REDUCE_PROB +
(isLastFailed ? config.failedAddProb : 0)
);
if (successCount >= config.successNumber || totalCount >= config.maxTry || curProb <= 0) {
return successCount * SUCCESS_USE + (totalCount - successCount) * FAILED_USE;
}
return (
curProb * run({ totalCount: totalCount + 1, successCount: successCount + 1, isLastFailed: false }) +
(curProb === 1 ? 0 : (1 - curProb) * run({ totalCount: totalCount + 1, successCount, isLastFailed: true }))
);
};
return run({ totalCount: 0, successCount: 0, isLastFailed: false });
}
console.log(
calc({
// 需要成功次数
successNumber: 2,
// 砍抬次数上限
maxTry: 7,
// 初始成功率(游戏内看的要去除生活技能首次增加的成功率)
initProb: 0.8,
// 生活技能:首次议价增加成功率
fistTryAddProb: 0,
// 生活技能:失败时下一次增加成功率
failedAddProb: 0.05,
// 生活技能:议价失败时增加的疲劳值减少
reduceGrowthWhenFailed: 1,
})
);
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment