Fisher-Yates Shuffle算法错误

时间:2015-06-10 07:56:18

标签: arrays algorithm actionscript-3 for-loop

所以我目前正在使用Actionscript 3.0进行问答游戏,我想用这个Fisher-Yates Shuffle算法来改变问题:

这是我的代码:

var questions:Array = [1,2,3,4,5,6,7,8,9,10];
function ShuffleArray(input:Array)
{
    for (var i:int=input.length-1; i>=0; i--)
    {
        var randomIndex:int = Math.floor(Math.random() * (i+1));
        var itemAtIndex:int = input[randomIndex];
        input[randomIndex] = input[i];
        input[i] = itemAtIndex;
    }
}

function buttoncorrect(event:MouseEvent):void
{
ShuffleArray(questions);
trace (questions);
var quest:int = questions.splice(questions, 1)[0];
trace(quest);
}

btntry.addEventListener(MouseEvent.CLICK,buttoncorrect);

以下是跟踪结果:

9,7,5,10,4,8,6,2,1,3
9
7,1,2,6,8,10,5,4,3
7
5,2,3,10,6,1,8,4
5
4,3,10,6,2,8,1
4
2,1,8,3,6,10
2
10,8,6,1,3
10
3,8,6,1
3
1,8,6
1
6,8
6
8
0

为什么我总是得到" 0"价值到底?我应该得到" 8"对? 有人知道我的代码有什么问题吗?谢谢。

1 个答案:

答案 0 :(得分:4)

问题在于这一行:

var quest:int = questions.splice(questions, 1)[0];

splice()的第一个参数应该是一个起始索引。由于您要删除第一个元素,因此它应为零:

var quest:int = questions.splice(0, 1)[0];

您的代码适用于除最后一个案例之外的每个案例的原因是因为从Array到int的自动类型转换的工作方式。当ActionScript具有多个元素时,ActionScript会自动将作为第一个参数传递的数组转换为零,但当它具有单个元素时,将其转换为数组中唯一元素的值。所以它是有效的:

var quest:int = questions.splice(0, 1)[0];

直到最后一次调用,当你传入一个包含单值8的数组时。然后在上次调用它时,你实际上是这样做的:

var quest:int = questions.splice(8, 1)[0];

由于该索引超出了数组的末尾,因此返回一个空数组并将其追溯为0。