7

JavaScript

このようなものを探してみましたが、見つかりません。

それは簡単な考えです:

a。0〜10の乱数を取ります。

b。ロールされた乱数が3であるとしましょう。

c。次に、番号(3)を保存します。

d。ここで、0から10の間の別の乱数を再度取得しますが、すでに表示されているため、3にすることはできません。

4

6 に答える 6

19

1つの解決策は、選択するすべての値(この場合は0から10までのすべての数値)を含む配列(「バケット」)を生成することです。次に、配列からランダムに1つを選択し、バケットから削除します。以下の例ではバケットが空かどうかをチェックしないため、以下の関数を10回以上呼び出すと、エラーが発生することに注意してください。

var bucket = [];

for (var i=0;i<=10;i++) {
    bucket.push(i);
}

function getRandomFromBucket() {
   var randomIndex = Math.floor(Math.random()*bucket.length);
   return bucket.splice(randomIndex, 1)[0];
}

// will pick a random number between 0 and 10, and can be called 10 times
console.log(getRandomFromBucket());
于 2012-10-20T11:05:55.617 に答える
1
Var rnd = getRnd();

While(rnd != lastRnd)
  rnd = getRnd();

getRnd()乱数を生成する関数はどこにありますか。

実際には、現在の乱数が配列内にあるかどうかを確認する必要があります...そして、可能な乱数のリストが小さい場合は、無限ループに注意してください。

于 2012-10-20T11:03:52.280 に答える
1

d3を使用:

var bucket = d3.shuffle(d3.range(11));

while(bucket.length) {
  console.log(bucket.pop());
}
于 2016-11-01T16:52:44.247 に答える
0

次のようなものを使用できます。

/**
* range Get an array of numbers within a range
* @param min {number} Lowest number in array
* @param max {number} Highest number in array
* @param rand {bool} Shuffle array
* @return {array}
*/
range: function( min, max, rand ) {
  var arr = ( new Array( ++max - min ) )
    .join('.').split('.')
    .map(function( v,i ){ return min + i })
  return rand
    ? arr.map(function( v ) { return [ Math.random(), v ] })
       .sort().map(function( v ) { return v[ 1 ] })
    : arr
}

そして、次のように使用します。

var arr = range( 1, 10, true )

これで、1 から 10 までの 10 個の数字がランダムな順序で繰り返されることのない配列ができました。次に、これを行うことができます:

arr.forEach(function( num, i ) { 
  // do something, it will loop 10 times 
  // and num will always be a different number
  // from 1 to 10
});
于 2012-10-20T11:11:43.870 に答える
0

楽しみのために: @ Strillesから派生し、「バケット コンストラクター」に応答します。

function RandomBucket(from,until){
  min = (Number(from) || 0);
  max = (Number(until) || 10)+1;
  this.bucket = String(Array(max-min)).split(',').map(function(i){
     return min++;
  });

  if (!RandomBucket.prototype.get){
   RandomBucket.prototype.get = function(){
      var randomValue = 
        this.bucket.length < 2
        ? this.bucket.shift()
        : this.bucket.splice(Math.floor(Math.random()*this.bucket.length),1);
       return randomValue || 'bucket empty';
      };
  }
}

使用例についてはJsFiddleを参照してください

于 2012-10-20T12:59:58.177 に答える