使用indexOf循环时的Actionscript 3

时间:2010-04-21 09:05:21

标签: actionscript-3

为什么这个循环被卡住了?我无法理解它:

var i:Number = -1;
do
{
i = Math.round(Math.random() * _totalQuestions);
}
while(_usedQuestions.indexOf(i));

其中_usedQuestions是一个数字数组。这个数组开始为空。

谢谢!

编辑:如果我没有在数组中找到,我希望循环结束。这样我就知道我之前没有选择过的问题。

3 个答案:

答案 0 :(得分:1)

这里确实有两个答案。

  1. 循环永不退出,因为Array.indexOf()如果找不到参数则返回-1,并且在布尔上下文中-1为真。如果i碰巧等于_usedQuestions[0],那么您的循环将退出的唯一方式。

  2. 这可能不是很明显,但即使您修复了上述问题,一旦所有问题都被使用,您的循环仍然无法退出...这就是您的真正问题 - 您使用的是混淆算法做一些简单的事情。

  3. 简单地保留两个数组会更有意义 - 一个看不见的问题和一个看到的问题。每次选择新问题时,只需将其从unseen中删除,然后将其添加到seen即可。像这样:

    if (unseen.length > 0) {
        var i:int = Math.floor( Math.random() * unseen.length );
        seen.push( unseen[i] );
        unseen.splice(i, 1);
    } else // all questions seen...
    

    请记住:编写正常工作的程序仅仅是编程的最低要求。一个好的程序员编写的程序也很容易被人们理解!其中很大一部分是确保以简单的方式完成简单的事情。 (除非表演是一个不可避免的因素 - 但在这种情况下,我绝对保证不会!)

答案 1 :(得分:0)

试试这个。

    var i:Number = -1;
    var found:Boolean;
    do
    {
        i = Math.round(Math.random() * _totalQuestions);

        found = false;
        for (var j:int = 0; j < _usedQuestions.length; j++)
        {
            // assume that _usedQuestions is an array which holds the question
            // number that has been selected before
            if (_usedQuestions[j] == i)
            {
                found = true;
                // get out of for loop if found, we'll need to get another
                // random number
                break;
            }
        }
    }
    while (found);  

我不熟悉AS3,因为刚刚开始学习它,所以有人可能有更有效的方法来完成上述工作。

答案 2 :(得分:0)

如果没有找到任何内容,

indexOf将返回-1,因此请使用该值,以避免无限循环检查_useQuestions不包含所有totalQuestions:

修改:一个更完整的版本来说明:

var checked:int = 0;
var seen:Dictionary = new Dictionary();
while (checked < _totalQuestions) {
    var i:int = int(Math.random() * _totalQuestions);
    if (_usedQuestions.indexOf(i) < 0) {
        break;
    } else if (seen[i] === undefined) {
        seen[i] = i;
        checked++;
    }
}
if (checked < _totalQuestions) {
    //ok you have found a non used questions
} else {
    // all questions have been used
}