0

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

创建 2 个唯一数字,它们都在一定范围内,并且它们至少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??
            }
        }

    }

}

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

4

3 回答 3

3

您可以分两步执行此操作。

  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)];

js小提琴

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

于 2012-09-05T07:51:41.817 回答
1

您可以改变不选择数字的间隙,即x在 0 和range-之间选择一个随机数gap,而不是在 and 之间选择第一个数字,在 and 之间选择第二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) 中工作。

于 2012-09-05T07:54:38.597 回答
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 个数字可以生成时,这无关紧要!

于 2012-09-05T07:54:36.377 回答