为什么这个循环被卡住了?我无法理解它:
var i:Number = -1;
do
{
i = Math.round(Math.random() * _totalQuestions);
}
while(_usedQuestions.indexOf(i));
其中_usedQuestions是一个数字数组。这个数组开始为空。
谢谢!
编辑:如果我没有在数组中找到,我希望循环结束。这样我就知道我之前没有选择过的问题。
答案 0 :(得分:1)
这里确实有两个答案。
循环永不退出,因为Array.indexOf()
如果找不到参数则返回-1
,并且在布尔上下文中-1为真。如果i
碰巧等于_usedQuestions[0]
,那么您的循环将退出的唯一方式。
这可能不是很明显,但即使您修复了上述问题,一旦所有问题都被使用,您的循环仍然无法退出...这就是您的真正问题 - 您使用的是混淆算法做一些简单的事情。
简单地保留两个数组会更有意义 - 一个看不见的问题和一个看到的问题。每次选择新问题时,只需将其从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
}