SOURCE

// books:书的列表
// numPeople:要分配给的人数
// numTimes:要分配的次数
function distributeBooks(books, numPeople, numTimes) {
  // 如果人数或次数小于等于0,或者书的数量不足以分配给所有人,返回无效输入
  if (numPeople <= 0 || numTimes <= 0 || books.length < numPeople * numTimes) {
    return "Invalid input!";
  }

  // 复制一份书列表,以便不破坏原始数据
  const bookList = [...books];
  const bookCount = bookList.length;

  // 计算每个人应该分配到的书的数量
  const avgBooks = Math.floor(bookCount / numPeople);
  let extraBooks = bookCount % numPeople;

  // 定义结果数组
  const result = [];

  // 定义起始和结束索引,以便将书分配给每个人
  let startIndex = 0;
  let endIndex = 0;

  // 对于每个人,分配平均数量的书
  for (let i = 0; i < numPeople; i++) {
    // 初始化空数组,以便将书分配给当前人
    result[i] = [];

    // 结束索引是起始索引加上平均分配量
    endIndex += avgBooks;

    // 如果有剩余的书,将它们分配给前面的人
    if (extraBooks > 0) {
      endIndex++;
      extraBooks--;
    }

    // 将书分配给当前人
    for (let j = startIndex; j < endIndex; j++) {
      // 随机选择一本书
      const bookIndex = Math.floor(Math.random() * bookList.length);
      // 将选中的书添加到结果数组中
      result[i].push(bookList[bookIndex]);
      // 从书列表中删除选中的书
      bookList.splice(bookIndex, 1);
    }

    // 更新起始索引,以便将书分配给下一个人
    startIndex = endIndex;
  }

  // 返回结果数组
  return result;
}


var books = ['a', 'b', 'c', 'd', 'e', 'f', 'iii', 'jjj', 'kkk', 'lll'];
var numPeople = 8;
var numTimes = 1;

var result = distributeBooks(books, numPeople, numTimes);
console.log(result);
console 命令行工具 X clear

                    
>
console