You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实现评分与消息关联:将评分范围分割为非均等子区间

实现动态评分区间与消息的关联映射

需要实现一个函数,将1~ratingRange的动态评分映射到长度可变的消息数组,每个消息对应一个非均等但尽可能均匀分布的评分区间。比如评分范围10、4条消息时,区间划分为[1-3,4-6,7-8,9-10],分别对应"Bad","Okay","Good","Amazing"。

解决方案

核心思路是先计算每个区间的基础长度,再将余数分配给前N个区间(N为余数),让前几个区间多1个评分值,保证整体分布均匀。通过遍历累计区间长度,找到当前评分所在的区间,返回对应消息。

function getMessageByRating(
  ratingRange: number,
  messagesArray: string[],
  currentRating: number
): string {
  const messageCount = messagesArray.length;
  if (messageCount === 0) return '';
  if (currentRating < 1) return messagesArray[0];
  if (currentRating > ratingRange) return messagesArray[messageCount - 1];

  const baseIntervalLength = Math.floor(ratingRange / messageCount);
  const remainder = ratingRange % messageCount;

  let cumulativeEnd = 0;
  for (let i = 0; i < messageCount; i++) {
    const intervalLength = baseIntervalLength + (i < remainder ? 1 : 0);
    cumulativeEnd += intervalLength;
    if (currentRating <= cumulativeEnd) {
      return messagesArray[i];
    }
  }

  return messagesArray[messageCount - 1];
}

测试验证

以下测试用例均符合预期:

// 评分范围5,3条消息
getMessageByRating(5, ['Bad', 'Okay', 'Good'], 2); // 'Bad'
getMessageByRating(5, ['Bad', 'Okay', 'Good'], 4); // 'Okay'
getMessageByRating(5, ['Bad', 'Okay', 'Good'], 5); // 'Good'

// 评分范围10,3条消息
getMessageByRating(10, ['Bad', 'Okay', 'Good'], 4); // 'Bad'
getMessageByRating(10, ['Bad', 'Okay', 'Good'], 5); // 'Okay'
getMessageByRating(10, ['Bad', 'Okay', 'Good'], 7); // 'Okay'
getMessageByRating(10, ['Bad', 'Okay', 'Good'], 8); // 'Good'

// 评分范围10,4条消息
getMessageByRating(10, ['Bad', 'Okay', 'Good', 'Amazing'], 3); // 'Bad'
getMessageByRating(10, ['Bad', 'Okay', 'Good', 'Amazing'], 4); // 'Okay'
getMessageByRating(10, ['Bad', 'Okay', 'Good', 'Amazing'], 6); // 'Okay'
getMessageByRating(10, ['Bad', 'Okay', 'Good', 'Amazing'], 7); // 'Good'
getMessageByRating(10, ['Bad', 'Okay', 'Good', 'Amazing'], 8); // 'Good'
getMessageByRating(10, ['Bad', 'Okay', 'Good', 'Amazing'], 9); // 'Amazing'

逻辑说明

  1. 边界处理:提前处理空消息数组、评分低于1或超过ratingRange的情况,避免逻辑出错。
  2. 区间计算:
    • baseIntervalLength:每个区间的基础长度,由评分范围除以消息数取整得到。
    • remainder:评分范围除以消息数的余数,将这部分额外的评分值分配给前remainder个区间,每个区间长度加1。
  3. 区间匹配:遍历累计每个区间的结束值,当当前评分落在该区间内时,返回对应的消息。

内容的提问来源于stack exchange,提问作者CoJanks

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 03:02:11