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

Create Javascript Array With 2 Unique Numbers

本文关键字:Javascript 数组 数字 唯一 2个 创建      更新时间:2023-09-26

我正在尝试执行以下操作:

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

例如:

范围为0-600最小"差值"为150

因此生成的数字可以是:[2400],[120310],[82530]

但不是[900400]或[200220]。

这就是我目前所拥有的:

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??
            }
        }
    }
}

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

您可以通过两个步骤来完成此操作。

  1. 生成您的第一个随机数
  2. 将随机数池减少到唯一可能的有效值
  3. 在减少的池中选择下一个随机数

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。

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

您可以改变不选择数字的间隔,即在0和range-gap之间选择一个随机数x,而不是在0x之间选择第一个,在x + gaprange之间选择第二个。这样会更有效率。

var range = 600, gap = 150;
var x = Math.floor(Math.random() * (range - gap));
var posX = (Math.random() * (x)).toFixed();
var posY = (Math.random() * (range - x - gap) + x + gap).toFixed();

在O(1)中工作。

简单地尝试一下怎么样?非常容易,当差异比最大尺寸(例如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个数字要生成时,这无关紧要!