gpt4 book ai didi

arrays - Fisher-Yates 洗牌算法错误

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:36:39 25 4
gpt4 key购买 nike

所以我目前正在使用 Actionscript 3.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];

除了最后一种情况之外,您的代码适用于每种情况的原因是因为从 Array 到 int 的自动类型转换的工作方式。当 ActionScript 具有多个元素时,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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com