Я создаю программу, которая задаст вопрос и даст 5 вариантов ответов.
Один из них предопределен и правилен, другие, которые я хочу быть случайным выбором из банка ответов, и весь массив тоже нужно перетасовать.Создание рандомизированного массива с одним предопределенным выбором в JavaScript
Я что-то написал, но у него есть некоторые несоответствия.
Во-первых, иногда заданный выбор дважды появляется в списке (он пропускает мою проверку if
). Другое, что иногда редактор вылетает, когда я запускаю его.
Я использую петли for in
, и я волнуюсь, что авария вызвана бесконечным циклом.
Вот мой код:
private var numberOfComponents:int;
private var maxComponents:int = 5;
//numberOfComponents returns the length property of my 'components' answer bank
componentsSelection = buildComponentSelectionList(0); //0 is the index of my correct answer
function buildComponentSelectionList(correctItemIndex){
var theArray:Array = new Array();
var indicesOfSelection:Array = getIndicesByIncluding(correctItemIndex);
Debug.Log(indicesOfSelection);
for (var i=0;i<indicesOfSelection.length;i++)
theArray.Push(components[indicesOfSelection[i]]);
return theArray;
}
function getIndicesByIncluding(correctItem){
var indicesArray:Array = new Array();
var numberOfChoices = maxComponents-1;
for(var i=0;i<numberOfChoices;i++){
var number = Mathf.Round(Random.value*(numberOfComponents-1));
addToRandomNumberSelection(indicesArray, number,correctItem);
}
indicesArray.Push(correctItem);
RandomizeArray(indicesArray);
return indicesArray;
}
function addToRandomNumberSelection(indicesArray:Array,number,correctItem){
if(indicesArray.length == 0){
indicesArray.Push(number);
} else {
var doesntExist = true;
for(var i=0;i<indicesArray.length;i++){
if(indicesArray[i] == correctItem)
doesntExist = false;
if (indicesArray[i] == number)
doesntExist = false;
}
if(doesntExist) {
indicesArray.Push(number);
} else {
addToRandomNumberSelection(indicesArray, Mathf.Round(Random.value*(numberOfComponents-1)),correctItem);
}
}
}
function RandomizeArray(arr : Array)
{
for (var i = arr.length - 1; i > 0; i--) {
var r = Random.Range(0,i);
var tmp = arr[i];
arr[i] = arr[r];
arr[r] = tmp;
}
}
Редактор Unity3D, а код представляет собой версию JavaScript; Я думаю, что моя ошибка является логической, а не синтаксической.
Я чувствую, что слишком долго смотрю на этот код, и мне не хватает чего-то очевидного.
Может ли кто-нибудь мне помочь?
Ну для начала не использовать 'для .. . в циклах для численных индексированных массивов. Используйте индексную переменную. – Pointy
Хорошо, я преобразовал их в индексированные. Я все еще получаю крах, но не больше дубликатов! –
Чтобы упростить свой скрипт, используйте 'if (indecesArray.indexOf (number) <0)', чтобы определить, что элемент не существует. Когда вы говорите, что иногда редактор выходит из строя, он дает вам какие-либо указания на то, почему? Может быть, ваш рекурсивный вызов метода выходит из-под контроля? (I.e., вы всегда получаете значение 'doesntExist'' false'). Собственно, теперь, когда я смотрю на это, не всегда ли так будет, если у вас есть 'correctItem' в массиве? – Thor84no