0

我有一个从名为 quizQuestions 的数组中获取问题的函数,显示所选问题,将其从数组中拼接起来,并将问题和正确答案推送到新数组中,以便稍后在结果屏幕中使用:

// The questions are stored in an array called "quizQuestions"
function makeQuestion()
    var randNum:Number = Math.round(1 + (quizQuestions.length - 1) * Math.random());
    mc_quiz.question.text = quizQuestions[randNum][0];
    answer = quizQuestions[randNum][1];
    quizQuestions.splice(randNum,1);    
    printQuestions.push(new Array(mc_quiz.question.text, answer));
}

它运行良好,但有时,一个问题会被问两次。您可以继续测试,但结果不显示信息。事实上,它只显示复制前回答的问题的结果。我已经目视检查并使用“重复元素查找器”,并且数组中没有重复的问题。

拼接可以不时执行吗?你能在函数中看到任何“错误”吗?会不会因为更难的问题而发生?

提前致谢。

4

1 回答 1

1

您的随机数生成不仅在数学上是错误的(即它不会生成真正的随机项),它还会不时生成超出数组范围的数字。解释这一点:1+(array.length-1) * Math.random()将生成任何大于或等于 1 的数字(这也将导致永远不会返回数组的第一项,因为数组是从 0 开始的),最多小于数组的实际长度. 如果您Math.round()获得最高可能的结果,它将四舍五入到下一个最高整数,这又是全长 - 如果您访问array[array.length],则会引发错误,这可能是您看到的奇怪行为的原因。

这是一个可能的解决方案:

Math.round()无论如何都会产生随机数偏差(请参阅@OmerHassans 链接),所以你最好使用int()or Math.floor()。此外,Math.random()定义为0 <= n < 1,因此它永远不会返回 1。因此,您可以将随机索引生成器简化为int(Math.random()*array.length)=> 任何小于数组长度的整数。 splice(),然后,返回已删除项的数组,因此您可以传递其第一项,而不是创建新数组。

function getRandomItem( arr:Array ):* {
    var rand:int = Math.random()*arr.length;
    return arr.splice( rand, 1 )[0];
}

function makeQuestion():void {
    var q:Array = getRandomItem( quizQuestions );
    mc_quiz.question.text = q[0];
    answer=q[1];
    printQuestions[printQuestions.length] = q;
}

array.push(item)仅供参考:在这种情况下这并不重要,但是通过替换.你可以获得更快的性能array[array.length]=item;

于 2013-09-08T08:15:06.417 回答