js 二维数组交叉取随机数,如何实现取到的随机数比较平均?

发布于 2022-09-04 23:47:13 字数 729 浏览 11 评论 0

有一个二维数组,如何交叉(上下左右不相邻)取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()

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

甜中书 2022-09-11 23:47:13

条件是上下左右不相邻。假设起始点坐标为(0,0),那么屏蔽以下点(-1, 0), (0, -1), (1, 0), (0, 1)。这些点的特性是:x的绝对值加y的绝对值等于1。在合理范围内随机x,y坐标的值并各取绝对值相加,如果不等于1且之前没有取过这个坐标即为合法。

童话 2022-09-11 23:47:13

这里提供一种非常简单但完全满足需求的 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]
  ]
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文