0

私は次のことをしようとしています:

両方とも特定の範囲内にあり、少なくともn大きい/小さい 2 つの一意の番号を作成します。

例:

範囲は 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

これは 2 つの手順で行うことができます。

  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 .

無作為に選択して比較するよりも遅いかもしれませんが、少なくとも実行時間は保証されています:)

于 2012-09-05T07:51:41.817 に答える
1

番号を選択しないギャップをシフトできます。つまり、最初の番号を と の間で選択し、2 番目の番号を と の間で選択するよりも、x0 とrange-の間の乱数を選択します。その方が若干効率的でしょう。gap0xx + 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 に答える