JS - 随机数组项目,已排除已给出的值

时间:2014-08-19 19:06:40

标签: javascript function random position rectangles

需要为此找到解决方案。

我有3个对象位于屏幕上的位置:Object1 -0.7,Object2 0,Object3 -0.7。

现在我想把这个位置随机调用,所以每当我调用该函数时,3个对象都有不同的X位置而没有重叠。

到目前为止,我有:

    var rectPos = [ -0.7, 0, 0.7 ];
    var rand1 = rectPos[Math.floor(Math.random() * rectPos.length)];
    var rand2 = rectPos[Math.floor(Math.random() * rectPos.length)];
    var rand3 = rectPos[Math.floor(Math.random() * rectPos.length)];

rect1 = rand1;
rect2 = rand2;
rect3 = rand3; 

但我无法弄清楚如何不让对象超载。

任何想法?

2 个答案:

答案 0 :(得分:1)

您有多种解决方案。您可以随机播放数组,然后选择第一个矩形的第一个值,第二个矩形的第二个值等。其他方法可以是在“选择”后从数组中删除选定的值。以下示例适用于任何大小的数组。

1随机排序的简单随机播放(请注意,您可以使用Fisher Yates Algorithm进行更好的随机化:?)

var arr = [-0.7, 0, 0.7];

arr.sort(function(){
    return Math.random() - Math.random();
});

// rect1 = arr[0] 
// rect2 = arr[1] ... etc.

JSFiddle Demo

2从数组中删除随机化的

var arr = [-0.7, 0, 0.7];

var copy = arr.slice(0); // Copy the initial array
var rects = [];

for(var i = 0; i < arr.length; i += 1){
    var index = Math.floor(Math.random() * copy.length);
    rects.push(copy[index]);
    copy.splice(index, 1); // Remove the 'chosen' value from the copied array
}

// rect1 = rects[0] 
// rect2 = rects[1] ... etc.

JSFiddle Demo

3其他喜欢随机播放,而randomed值不是唯一的.. [没有演示]

答案 1 :(得分:0)

你不能这样做吗?:

var rand1 = Math.floor(Math.random() * rectPos.length);

@Edit:

var test = [-0.7, 0, 0.7];

function getPosition() {
  var rectPos = test.slice(); ;
  function getX(index) {
    var res = rectPos[index];
    rectPos.splice(index, 1);
    return res
  }
  var rand1 = getX(Math.floor(Math.random() * rectPos.length));
  var rand2 = getX(Math.floor(Math.random() * rectPos.length));
  var rand3 = getX(Math.floor(Math.random() * rectPos.length));
}