有一個二維數組,如何交叉(上下左右不相鄰)取2或3個隨機數?
陣列:
var a = [
[0, 1],
[2, 3],
[4, 5],
[6, 7]
];
這樣寫了一個,但是感覺很死板,取到的數不太平均而且代碼寫的有點臃腫,大神們有更好的方案嗎?
function select() {
var a = [
[0, 1],
[2, 3],
[4, 5],
[6, 7]
];
var lastSelect = -1;
for (var i = 0; i < a.length; i++) {
var index = getRandomNumber(lastSelect, a[i].length);
console.log(a[i][index]);
lastSelect = index;
}
}
function getRandomNumber(lastSelect, max) {
var random = Math.floor(Math.random() * max);
if (random == lastSelect) return getRandomNumber(lastSelect, max);
else return random;
}
select()
條件是上下左右不相鄰。假設起始點座標為(0,0),則屏蔽下列點(-1, 0), (0, -1), (1, 0), (0, 1)。這些點的特性是:x的絕對值加y的絕對值等於1。在合理範圍內隨機x,y座標的值並各取絕對值相加,若不等於1且之前沒有取過這個座標即為合法。
這裡提供一個非常簡單但完全滿足需求的 hack 思路,即故意【交叉著取數】,來達到【上下左右不相鄰】的需求,只需兩行: