1 ~ 3 の数値を持つ変数があります。
1 から 3 の間で新しい数値をランダムに生成する必要がありますが、最後の数値と同じであってはなりません。
何百回もループして発生します。
これを行う最も効率的な方法は何ですか?
1 ~ 3 の数値を持つ変数があります。
1 から 3 の間で新しい数値をランダムに生成する必要がありますが、最後の数値と同じであってはなりません。
何百回もループして発生します。
これを行う最も効率的な方法は何ですか?
剰余算術の力があなたを助けますように!!
この関数は、モジュロ演算子を使用して必要なことを行います。
/**
* generate(1) will produce 2 or 3 with probablity .5
* generate(2) will produce 1 or 3 with probablity .5
* ... you get the idea.
*/
function generate(nb) {
rnd = Math.round(Math.random())
return 1 + (nb + rnd) % 3
}
関数呼び出しを避けたい場合は、コードをインライン化できます。
これがあなたの問題を解決するjsFiddleです:http://jsfiddle.net/AsMWG/
1、2、3 を含む配列を作成しました。最初に任意の数値を選択し、最後の要素と交換します。次に、位置 0 と 1 から要素のみを選択し、それらを最後の要素と交換します。
var x = 1; // or 2 or 3
// this generates a new x out of [1,2,3] which is != x
x = (Math.floor(2*Math.random())+x) % 3 + 1;
Widor がコメントしたように、そのような数値を生成することは、確率 0.5 の数値を生成することと同じです。したがって、次のようなことを試すことができます(テストされていません):
var x; /* your starting number: 1,2 or 3 */
var y = Math.round(Math.random()); /* generates 0 or 1 */
var i = 0;
var res = i+1;
while (i < y) {
res = i+1;
i++;
if (i+1 == x) i++;
}
JavaScript に組み込まれている乱数ジェネレーターを使用して、ランダムに数値を生成できます。を使用する必要がありますMath.random()
。
配列に -ing している場合push()
は、以前に挿入されたものが同じ番号であるかどうかをいつでも確認できるため、番号を再生成します。次に例を示します。
var randomArr = [];
var count = 100;
var max = 3;
var min = 1;
while (randomArr.length < count) {
var r = Math.floor(Math.random() * (max - min) + min);
if (randomArr.length == 0) {
// start condition
randomArr.push(r);
} else if (randomArr[randomArr.length-1] !== r) {
// if the previous value is not the same
// then push that value into the array
randomArr.push(r);
}
}
コードはテストされており、目的に応じて機能します。
var RandomNumber = {
lastSelected: 0,
generate: function() {
var random = Math.floor(Math.random()*3)+1;
if(random == this.lastSelected) {
generateNumber();
}
else {
this.lastSelected = random;
return random;
}
}
}
RandomNumber.generate();