随机数组重复索引项

时间:2013-10-23 17:37:55

标签: javascript

此代码在他们的示例中工作正常,但在我尝试使用它时会重复我的一些索引项。

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;

任何人都可以告诉我这段代码中缺少什么,以防止它重复我的数组中的项目吗?

2 个答案:

答案 0 :(得分:1)

我不确定我是否完全理解你的页面是如何工作的,但似乎它正在改组数组以便找出下一页要去的地方。这意味着每次加载页面时都会重新洗牌,因此您无法保证页面的唯一性 - 实际上,您最不可能获得所有唯一页面(n!中的1个!)精确)

为了确保唯一性,您必须保存生成的订单,而不仅仅是您所在的索引。

答案 1 :(得分:0)

您的jtemp声明存在问题,这可能会导致多次混乱并给您一些奇怪的行为。

特别是这一行:

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(),可以将您的随机播放与页面加载分离。