簡體   English   中英

創建具有2個唯一數字的Javascript數組

[英]Create Javascript Array With 2 Unique Numbers

我正在嘗試執行以下操作:

創建兩個都在一定范圍內且至少大於或小於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??
            }
        }

    }

}

但這會隨機使瀏覽器崩潰,而且當數字過於接近時,我也不知道重啟循環的好方法...

您可以分兩步執行此操作。

  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個數字來生成時,這將無關緊要!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM