Здесь действительно два ответа.
Цикл никогда не завершается, потому что Array.indexOf()
возвращает -1
, если аргумент не найден, а -1 имеет значение true в логическом контексте. Единственный выход из вашего цикла - это если 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...
Помните: написание программ, которые работают правильно, является лишь минимальным требованием программирования. хороший программист пишет программы, которые легко понимают и люди! И большая часть этого заключается в том, чтобы простые вещи делались простыми способами. (Если производительность не является неизбежным фактором - но в этом случае я абсолютно обещаю, что это не будет!)