需求如下:

军团列表刷新逻辑:
  1.优先随机出军团排行前3的军团1个置入   
  2.随机前10的军团3个置入
  3.随机出其他军团置入,不足所差的军团数量
单次刷新出军团上限:8
每个玩家申请军团上限:3

主要用到的知识点:filter,Math.random(),slice

假设排名已经排好了:

// 排名数组  [军团id]
var ranks = [100,101,102,105,104,107,103,109,108,110];
// 申请的军团  需要排除的
var apply = [101];
// 刷新出军团上限
var limit = 10;

// 取随机数 包含边界
function randRange(from, to) {
    return from + Math.floor(Math.random() * (to - from + 1));
}

 // 返回满足要求的数组
Array.prototype.diff = function (arr) {
    if(!arr || arr.length == 0) return this;
    return this.filter(function (value) {
        return arr.indexOf(value) <= -1
    })
};

/**
 * 取满足要求的军团
 * @param form,to   取随机数
 * @param num       取多少个
 * @param arr       已经满足要求的(当次执行需要排除的)
 * @param delArr    直接排除的
 */
function calcArr(ranksArr,form,to,num,arr,delArr) {
    var cur = ranksArr.slice(form - 1, to);
    delArr && (cur = cur.diff(delArr));// 排除已经申请的
    // 开始取个数
    for (var i = 0; i < num; i++) {
        cur = cur.diff(arr);
        var rg = randRange(0,cur.length - 1);
        cur[rg] && arr.push(cur[rg]);
    }
    return arr;
}

var top1 = calcArr(ranks,1,3,1,[],apply);
var top2 = calcArr(ranks,1,10,3,top1,apply);
var top3 = calcArr(ranks,1,10,limit - 4,top2,apply);
console.log(top3);

个人笔记,仅代表个人观点