Heim  >  Fragen und Antworten  >  Hauptteil

javascript - JS kreuzt zweidimensionale Arrays, um Zufallszahlen zu erhalten.

Es gibt ein zweidimensionales Array. Wie kann man es schneiden (nicht neben oben, unten, links und rechts), um 2 oder 3 Zufallszahlen zu erhalten?

Array:

var a = [
    [0, 1],
    [2, 3],
    [4, 5],
    [6, 7]
];

Ich habe so etwas geschrieben, aber es fühlt sich sehr starr an, die erhaltenen Zahlen sind nicht gerade und der Code ist etwas aufgebläht. Hat jemand eine bessere Lösung?

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()
PHP中文网PHP中文网2663 Tage vor1475

Antworte allen(2)Ich werde antworten

  • 伊谢尔伦

    伊谢尔伦2017-07-05 11:09:26

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

    Antwort
    0
  • 天蓬老师

    天蓬老师2017-07-05 11:09:26

    这里提供一种非常简单但完全满足需求的 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]
      ]
    }

    Antwort
    0
  • StornierenAntwort