1

何らかの理由で、次のコードが機能しません。

var a1 = Math.floor(Math.random()*4+1); 

//Answer2
for(a2 = 0; a2 != a1 && a2 != 0; a2 = Math.floor(Math.random()*4+1)){
    alert(a2);
}

「a2」を1〜4のintにしようとしていますが、「a1」と同等ではありません。

どうしたの?前もって感謝します!!!

編集:

ご協力ありがとうございました!これが私の最終結果です:

var a1, a2;
a1 = Math.floor(Math.random()*4+1); 
a2 = a1;

while(a2 == a1){
        a2 = Math.floor(Math.random() * 3 + 1);
        alert(a2);
}
4

6 に答える 6

5

代わりにwhileループはどうですか?初期化a2 = a1してから:

while(a2 == a1) {
    a2 = Math.floor(Math.random() * 4 + 1);
}
于 2012-09-21T01:48:22.000 に答える
4

テストのロジックが逆です。for ループは、テストが失敗した場合ではなく、テストが真である間実行を続けます。ではなく:a2 != a1 && a2 != 0が必要(a2 == a1) || (a2 == 0)です。また、アラートは a2 が無効な状態の場合にのみ実行されることにも注意してください。ただし、for に続くアラートは有効である必要があります。

または、剰余算術を使用してそれを行うための楽しい数学的な方法を探している場合 (再試行は必要ありません):

a2 = (Math.floor(Math.random() * 3 + (a1 + 1)) % 4) || 4
于 2012-09-21T01:46:49.233 に答える
2

この機能を試してみてください。1からmaxランダムな順序の番号の配列が表示されます。次に、それを使用して変数に値を割り当てることができ、繰り返されることはありません。

編集:私はそれを行うための純粋関数型の方法を見つけました:

function randomRange(min, max) {
  return (new Array(++max-min))
    .join('.').split('.')
    .map(function(v,i){ return min+i })
    .sort(function(){ return 0|Math.random()*max });
}

console.log(rand(1,4)); //-> [4,2,1,3] random array from 1 to 4

var arr = rand(1,4);
var a = arr[0];
var b = arr[1];
...

編集2:上記のようにいくつかのブラウザで問題があるようです。ランダムをチェックしてください。ただし、より良い解決策についてはChromeだけです。

デモ: http: //jsbin.com/ohohum/1/edit(ランダム性を確認するために複数回実行)

于 2012-09-21T02:31:22.060 に答える
1

数が除外したい数以上の場合は、1つ追加してください:

var a2 = Math.floor(Math.random() * 3 + 1);

if(a2 >= a1) {
    a2++;
}
于 2012-09-21T01:39:19.357 に答える
1

がゼロと同じでない場合、新しいa2値を選択しています。これは逆です。ループの前にゼロに設定するため、実行されません。a2a1a2

a2whileが 0 であるか、次の値に等しい場合は、ループする必要がありますa1

var a1 = Math.floor(Math.random()*4+1); 

//Answer2
for(a2 = 0; a2 == a1 || a2 == 0; a2 = Math.floor(Math.random()*4+1)){
    // nothing here
}   
alert(a2);
于 2012-09-21T01:47:46.600 に答える
0

この種のことを行うには、2 つの標準的な方法があります。もう少し一般的なフレームワークを検討していますが

フィルタリングされたリストからのサンプル

  1. 選択するベース値の配列を作成します

    var values = [1,2,3,4]
    
  2. 興味のない値を削除します

    values = Array.filter( values, function(x) { return x!=a1; } )
    
  3. リストからランダムに値を選択します

    var a2 = values[Math.floor(Math.random()*values.length)];
    

棄却サンプリングを使用する

  1. 選択する値の配列を作成します

     var values = [1,2,3,4]
    
  2. 値をランダムに選択し、成功するまで再試行します

     var a2 =  values[Math.floor(Math.random()*values.length)];
     while( a2==a1 )
     {
       a2 = values[Math.floor(Math.random()*values.length)];
     }
    

比較

nが初期リストの長さであり、m削除された要素の数であると考える場合、フィルター処理されたバージョンはn長さのフィルター処理されたリストを作成するために比較を行いますがn-m、乱数の生成は 1 回だけです。これに対し、棄却法は平均的なn/(n-m)比較と乱数の生成を行います。

于 2012-09-21T07:39:41.990 に答える