javascript - js 二维数组交叉取随机数,如何实现取到的随机数比较平均?
问题描述
有一个二维数组,如何交叉(上下左右不相邻)取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()
问题解答
回答1:条件是上下左右不相邻。假设起始点坐标为(0,0),那么屏蔽以下点(-1, 0), (0, -1), (1, 0), (0, 1)。这些点的特性是:x的绝对值加y的绝对值等于1。在合理范围内随机x,y坐标的值并各取绝对值相加,如果不等于1且之前没有取过这个坐标即为合法。
回答2:这里提供一种非常简单但完全满足需求的 hack 思路,即故意【交叉着取数】,来达到【上下左右不相邻】的需求,只需两行:
function pick (arr) { // 若数组长度为 5,则该下标 x 的范围为 1~3 // 直接依次取 a[x - 1], a[x], a[x + 1] 中交错的项即可 // 为了保证不越界而根据数组长度限制 x 取值范围 const pickedIndex = Math.max( 0, parseInt(Math.random() * arr.length - 2) ) + 1 // 第二维下标交错着 0 1 取值,达到数字不相交的需求 return [ arr[pickedIndex - 1][0], arr[pickedIndex][1], arr[pickedIndex + 1][0] ]}