生成随机的唯一行列列表 JavaScript

3
我该如何在javascript中生成(并单独打印)唯一的列、行对呢? 我有两个已设置的变量,分别为列数和行数。我只想让每个对出现一次,并且它不能为0。假设我有3行和3列,我想要:
1,2
3,1
2,3
1,3
1,1
2,1
3,2
2,2
3,3
所有内容以随机顺序呈现。我应该如何实现这个功能?

你想要什么?是以某种顺序写出网格中所有行列对吗? - Jeremiah Willcock
准确地说,最重要的是随机顺序。 - Leticia Meyer
5个回答

1

不是我的算法

<script type="text/javascript">

        var array = Array();

        var i,j;

        for(i=1; i <= 3; i++){
            for(j=1; j<=3; j++){    
                array.push(j+', '+i);
            }
        }
        var newarr = shuffle(array);
        console.log(newarr);
        document.write(newarr);

    function shuffle(array)
    { //v1.0
        for(var j, x, i = array.length; i; j = parseInt(Math.random() * i), x = array[--i], array[i] = array[j], array[j] = x);
        return array;
    };
</script>

1

这是一种方法:

var answer = (function(width,height) {
  var result = [];
  for (var i = 1; i <= width; i++) {
    for (var j = 1; j <= height; j++) {
      result.push([i, j]);
    }
  }
  return result.sort(function(a, b) {
    return 0.5 - Math.random();
  });
}(3,3)); // enter width/height here, 1-indexed

编辑:忘记了“print”要求:

for( var k = 0, len = answer.length; k < len; k++ ){
  console.log( answer[k] ); // or your preferred definition of "print"
}

1
你应该生成所有可能的坐标对的数组,使用洗牌算法将它们随机排序,然后打印出来。

那个函数有JavaScript版本吗?另外,我对JavaScript真的很菜,你能发一个生成数组并打乱它的例子吗? - Leticia Meyer
请查看 https://dev59.com/WHNA5IYBdhLWcg3wcNXF#962890 进行洗牌操作。我不太熟悉 JavaScript,无法编写创建数组的代码。 - Jeremiah Willcock
好的...但愿我知道如何创建数组。不过还是谢谢你的帮助,Jeremiah! - Leticia Meyer

0
Array.prototype.shuffle= function(force){
    var i, temp, L= this.length,
    A= force? this: this.concat();
    while(--L){
        i= Math.floor(Math.random()*L);
        temp= A[i];
        A[i]= A[L];
        A[L]= temp;
    }
    return A;
}

(可选)参数的目的是对数组本身进行洗牌。 默认情况下,数组不会被洗牌,但会返回一个洗牌后的副本。

0

这应该可以工作:

// New Array
a = [];
// 3 rows, 3 columns
c = 3;
r = 3;
// fill array with every unique possibility
for( var i = 1; i <= r; i++ ) {
  for( var j = 1; j <= c; j++ ) {
    a[a.length] = "" + i + "," + j;
  }
}
// random pick into another array
result = [];
a_len = a.length;
for( var i = 0; i < a_len; i++ ) {
  result[result.length] = a.splice(Math.floor(Math.random()*a.length), 1)[0];
}

如果你只想打印结果而不是将它们存储在数组中,只需使用“print”而不是“result[result.length]”。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接