创建具有2个唯一编号的Javascript数组

时间:2012-09-05 07:48:47

标签: javascript loops for-loop each

我正在尝试做以下事情:

创建两个在一定范围内的唯一数字,它们至少n更大/更小。

例如:

范围是0-600 最小“差异”是150

所以生成的数字可能是:[2,400],[120,310],[82,530]

但不是[900,400]或[200,220]。

这就是我到目前为止所拥有的:

var posYArray   = [];

for(i=0; i < 2; i++){ 

    var posY    = (Math.random() * 200).toFixed();

    if(i < 1){
        posYArray.push(posY);
    }else{

        for(i=0; i < posYArray.length; i++){ 
            if(posY < posYArray[i]+100){
                posYArray.push(posY);
            }else{
                //Restart loop??
            }
        }

    }

}

但这会随机崩溃浏览器,而且当数字太近时我也不知道重启循环的好方法......

3 个答案:

答案 0 :(得分:3)

你可以分两步完成。

  1. 生成您的第一个随机数。
  2. 将随机数池减少到唯一可能的值。
  3. 在简化池中选择下一个随机数。
  4. var upperBound = 200,
        minDelta = 90,
        firstRandom = Math.floor(Math.random() * upperBound);
    
    var validPool = [];
    
    for (var i = 0; i < upperBound; i++) {
        if (i < firstRandom - minDelta || i > firstRandom + minDelta) {
            validPool.push(i);
        }
    }
    
    var secondRandom = validPool[Math.floor(Math.random() * validPool.length)];
    

    jsFiddle

    它可能比随机选择和比较慢,但至少它有一个保证的运行时间:)

答案 1 :(得分:1)

你可以改变不选择数字的差距,即在0和x - range之间选择一个随机数gap,而不是在{{1}之间选择第一个}和0以及xx + gap之间的第二个。那会更有效率。

range

适用于O(1)。

答案 2 :(得分:0)

如果只是尝试它们呢?很容易,当差异小很多时,最大尺寸(例如150和600)你有1/2的可能性很好。

例如:

var posY = (Math.random() * 600).toFixed();
var posX = (Math.random() * 600).toFixed();
while(abs(poX-posY) < 150){
    posX = (Math.random() * 600).toFixed()
}

效率不高,但只有2个数字才能生成并不重要!