3

次のように、配列から変数にランダムな値を格納するためのコードがいくつかあります。

Quest=["value1","value2","value3","value4"];
var random=Math.floor( Math.random() * Quest.length );
var question = Quest[random];

コードの 2 行目と 3 行目を数回呼び出すため、同じ値が複数回生成されます。同じ値が順番に複数回生成されないようにするための効率的なコードを知っている人はいますか?

4

4 に答える 4

2

Fisher-Yates を使用して配列をシャッフルします。

var Quest=["value1","value2","value3","value4"];

function kfy(array)
{
  for (var i = array.length - 1; i > 0; --i) {
    var p = Math.floor(Math.random() * (i + 1)),
    tmp = array[p];
    array[p] = array[i];
    array[i] = tmp;
  }
}

console.log(Quest);
kfy(Quest);
console.log(Quest);

次に、配列の最初から最後まで繰り返します。

于 2013-03-28T07:39:18.577 に答える
2
  • 配列に 0 ~ (Quest.length-1) の数値を入力します。

  • このJavaScript コードを使用して、その配列をシャッフルします。

繰り返す:

  • 初めて(t=0)、配列[t]を出力します。

  • 2 回目 (t=1) では、配列 [t] を出力します。

  • t%Quest.length (または array.length)==0 の場合。

  • 再び配列をシャッフルします。

    繰り返します。

        function shuffle(o) 
        { 
         for (var j, x, i = o.length; i; j = parseInt(Math.random() * i), x = o[--i], o[i] = o[j], o[j] = x);
            return o;
        };
        Quest = ["value1", "value2", "value3", "value4"];
        var myarray = new Array();
        var i = 0;
        for (i = 0; i < Quest.length; i++) {
            myarray[i] = i;
        }
        shuffle(myarray);
        for (i = 0; i < myarray.length; i++) {
            document.write(myarray[i]);
        }
        for (i = 0; i < 50; i++) {
            if (i % (Quest.length) == 0) {
                shuffle(myarray);
            }
            document.write("<p>" + Quest[myarray[i % (Quest.length)]] + "</p>");
        }
    
于 2013-03-28T07:01:54.440 に答える
2

メソッドを使用してそれを行うことができますsplice

var Quest = ["value1", "value2", "value3", "value4"];
var random1 = Quest.splice(Math.floor(Math.random() * Quest.length), 1)[0];
...
var random2 = Quest.splice(Math.floor(Math.random() * Quest.length), 1)[0];
... 
var random3 = Quest.splice(Math.floor(Math.random() * Quest.length), 1)[0];

値が配列から削除されるため、Quest質問が繰り返されないことが保証されます

デモ: http://jsfiddle.net/dfsq/QUztw/3/

注: 初期配列を変更したくない場合は、そのコピーを使用できますQuest.slice()

于 2013-03-28T07:04:26.637 に答える
1

もう 1 つの可能性は、配列をランダムに並べ替えることです。

function randomOrder() {
 return (Math.round(Math.random())-0.5);
}

var Quest = ["value1", "value2", "value3", "value4"];
Quest.sort(randomOrder);

その時点で、配列を歩くことができ、繰り返されるべきではありません。

于 2013-03-28T07:06:52.387 に答える