今天正式建立 src/logic/recommend.js,把前兩天討論的分位數概念,寫成可以執行的程式碼。
// src/logic/recommend.js
/**
* 計算陣列的分位數
* @param {number[]} values 歷史花費時間(分鐘)
* @param {number} percentile 0~1 之間,例如 0.9 代表 90% 信心水準
*/
function calculatePercentile(values, percentile) {
const sorted = [...values].sort((a, b) => a - b);
const index = Math.ceil(percentile * sorted.length) - 1;
const safeIndex = Math.min(Math.max(index, 0), sorted.length - 1);
return sorted[safeIndex];
}
有了分位數函式,我們可以寫出核心的推薦邏輯:
// src/logic/recommend.js(新增)
/**
* 根據歷史花費時間與使用者期望信心水準,推薦出發時間
* @param {number[]} historyMinutes 歷史花費時間紀錄
* @param {number} confidenceLevel 使用者期望信心水準(0~1)
* @param {Date} arrivalDeadline 使用者希望到達的時間
*/
export function recommendDepartureTime(historyMinutes, confidenceLevel, arrivalDeadline) {
const bufferMinutes = calculatePercentile(historyMinutes, confidenceLevel);
const departureTime = new Date(arrivalDeadline.getTime() - bufferMinutes * 60_000);
return {
departureTime,
bufferMinutes,
confidenceLevel,
};
}
在真正接上 TDX 歷史資料之前,先用一組模擬資料驗證邏輯是否合理:
import { recommendDepartureTime } from './logic/recommend.js';
const history = [25, 27, 26, 30, 28, 35, 26, 29, 27, 40];
const deadline = new Date('2026-09-01T09:00:00');
const result90 = recommendDepartureTime(history, 0.9, deadline);
console.log('90% 信心水準建議出發時間:', result90.departureTime.toLocaleTimeString());
const result50 = recommendDepartureTime(history, 0.5, deadline);
console.log('50% 信心水準建議出發時間:', result50.departureTime.toLocaleTimeString());
跑起來後你會發現,90% 信心水準給出的出發時間,會比 50% 更早,這正符合我們昨天討論的直覺:想要更有把握,就要多留一點緩衝時間。
明天,我們要把這段邏輯真正接到畫面上,並且串上前面已經有的 TDX 即時資料,讓它不再只是假資料測試。