所以我现在正在用ActionScript3.0做一个问答游戏,我想用Fisher-Yates的洗牌算法来洗牌:
这是我的代码:

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的值对吧?
有人知道我的代码出了什么问题吗谢谢您。

最佳答案

问题是这一行:

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

splice()的第一个参数应该是开始索引。因为要删除第一个元素,所以它应该为零:
var quest:int = questions.splice(0, 1)[0];

除了最后一种情况外,您的代码对每种情况都有效,这是因为从数组到int的自动类型转换的工作方式。ActionScript在数组有多个元素时自动将作为第一个参数传递的数组转换为零,但在数组只有一个元素时将其转换为数组中唯一元素的值所以它是有效的:
var quest:int = questions.splice(0, 1)[0];

直到最后一次调用,当您传入一个包含单个值8的数组时。最后一次调用它时,您实际上正在执行以下操作:
var quest:int = questions.splice(8, 1)[0];

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

关于arrays - Fisher-Yates随机算法错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30750415/

10-09 03:56