抽签不重复怎么保证的?不是「随机取一个、重复就重抽」——那样池子小时会接近死循环,且概率不均。
实际用的是 Fisher–Yates 洗牌 + 游标:进入新一轮时把候选池整体洗牌,用一个指针依次取,
指针到底就重新洗牌开新一轮。轮内严格等概率、绝对不重复,且游标落库,关掉页面再回来不会重抽。
为什么不直接取第 1 名?直接取第 1 名会退化成每天都吃同一个,算法误差还会被放大成
「每天都吃错」。所以是「排序 → 取前 N 名 → 带内均匀随机」,在最优和多样性之间取平衡。
为什么「今天就是不想吃这个」不算差评?这类拒绝和餐品质量无关。如果计入口味负反馈,
会误伤一批本来没问题的餐品,候选带越收越窄,最后整个产品变得不好用。所以它只记录、不调权重。
为什么把热量和营养藏起来了?排序引擎照样在用这些值 —— 数据库里一个字段都没少,
只是不再摆在卡面上。一张写着「640 kcal · 营养 3/5」的卡片是张营养标签,
而写着「💻 编程能力 +14% · 🍀 抽卡运气 +12%」的卡片才是张游戏卡。
想核对参数时,抽签页卡片下方有一块折叠的「幕后数据」。
食用加成是怎么来的?由 餐品 id + 当前等级确定性推导,所以同一家店永远是同一套词条,
刷新多少次都不变。C 级只从常见池取 1 条(可能偏中性甚至带点负面,比如「饭困 +12%」),
SSS 级取 3 条神话 + 2 条传说。把一家店的标签改对、让它从 B 升到 A,
它会当场多长出一条词条 —— 这是调参这件事第一次有可见的回报。