0

このコードは彼らの例では問題なく動作しますが、使用しようとするとインデックス項目の一部が繰り返されます。

var lastloaded = 0;
window.onload = loadPages;

    Array.prototype.knuthShuffle = function()
    {
        var i = this.length, j, temp;
        while ( --i )
        {
            j = Math.floor( Math.random() * (i - 1) );
            temp = this[i];
            this[i] = this[j];
            this[j] = temp;
        }
    };

var arr = ["aCard.html", "bCard.html", "cCard.html", "dCard.html"];

function loadPages () {
     arr.knuthShuffle();
    var frame = document.getElementById("frameWrap");
    if (lastloaded+1>arr.length){
        lastloaded = window.location = "greatJob.html";
    }
    frame.src = arr[lastloaded];
    lastloaded++;
};
document.getElementById('tom').onclick = loadPages;

配列内でアイテムが繰り返されないようにするために、このコードに欠けているものを誰か教えてもらえますか?

4

2 に答える 2

1

あなたのページがどのように機能するかを完全に理解しているかどうかはわかりませんが、次のページに移動するために配列をシャッフルしているようです。これは、ページが読み込まれるたびに新しくシャッフルされることを意味し、したがって、ページの一意性についての保証はありません。実際、すべての一意のページを取得することはほとんどありません (n 分の 1!、正確)

一意性を確保するために、現在のインデックスだけでなく、生成された注文を保存する必要があります。

于 2013-10-23T17:46:20.130 に答える
0

jandの宣言に問題があり、temp複数のシャッフルが加算され、奇妙な動作が発生する可能性があります。

特にこの行:

var i = this.length, j, temp;

そしてこれらの行:

j = Math.floor( Math.random() * (i - 1) );
temp = this[i];

ここでの問題は、変数jtemp変数を実際に宣言していないことです。これは無効な構文です。次に、キーワードなしでループ内でそれらを宣言すると、varそれらはグローバル変数として扱われます。最初の行を次のように変更することで解決できます。

var j, temp;
var i = this.length;

編集:実際にはそうではありません.t.nieseが指摘したように、クリックするたびにtom再シャッフルしています.

やりたいことは、一度シャッフルして、毎回新しくシャッフルされた配列を使用することです。arr.knuthShuffle();そのため、関数から取り出して、シャッフルをページの読み込みから分離しますloadPages()

于 2013-10-23T17:53:55.700 に答える