有一个二维数组,如何交叉(上下左右不相邻)取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 思路,即故意【交叉着取数】,来达到【上下左右不相邻】的需求,只需两行: