内循环遍历单位技巧

for(var a = 0; a < entitys.length; a++){
    for(var b = a + 1; b < entitys.length; b++){
        console.log(`${entitys[a].name}-${entitys[b].name} 
        distance:${entitys[a].GetDistance(entitys[b])}`);
    }
}

内循环并没有遍历所有的单位。它只是遍历了外循环还没有访问过的单位。这样就避免了对 每一对单位进行两次比较,正着比一次,反着再比一次。如果我们已经处理过了A和B之间的 碰撞,我们就不再需要再次检测B和A之间的碰撞了。

【算法】Knuth 洗牌算法

适用于打乱一串数组,同时也适用于在数组中随机抽取多个元素不重复

var knuth = (arr)=>{
    var swap = (ar, ia, ib)=>{
        var temp = ar[ia];
        ar[ia] = ar[ib];
        ar[ib] = temp;
    };
    var rand = (a,b)=>{
        return Math.ceil(a) + Math.floor(Math.random() * Math.floor(b-a));
    }
    for(var i = arr.length - 1; i >= 0 ; i -- )
        swap(arr,i, rand(0, i)) // rand(0, i) 生成 [0, i] 之间的随机整数
    return arr;
}
knuth(new Array(8).fill(0).map((item,index)=>index));