2012-07-06 1 views
0

Я создаю программу, которая задаст вопрос и даст 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; Я думаю, что моя ошибка является логической, а не синтаксической.

Я чувствую, что слишком долго смотрю на этот код, и мне не хватает чего-то очевидного.
Может ли кто-нибудь мне помочь?

+3

Ну для начала не использовать 'для .. . в циклах для численных индексированных массивов. Используйте индексную переменную. – Pointy

+0

Хорошо, я преобразовал их в индексированные. Я все еще получаю крах, но не больше дубликатов! –

+0

Чтобы упростить свой скрипт, используйте 'if (indecesArray.indexOf (number) <0)', чтобы определить, что элемент не существует. Когда вы говорите, что иногда редактор выходит из строя, он дает вам какие-либо указания на то, почему? Может быть, ваш рекурсивный вызов метода выходит из-под контроля? (I.e., вы всегда получаете значение 'doesntExist'' false'). Собственно, теперь, когда я смотрю на это, не всегда ли так будет, если у вас есть 'correctItem' в массиве? – Thor84no

ответ

1

Вы можете перебрать варианты и определить вероятность того, что она должна быть включена, а затем перетасовать включены опции:

function getRandomOptions(allOptions, correctIndex, count){ 
    var result = [allOptions[correctIndex]]; 
    count--; 
    var left = allOptions.length; 
    for (var i = 0; count > 0; i++) { 
    if (i != correctIndex && Math.floor(Math.random() * left) < count) { 
     result.push(allOptions[i]); 
     count--; 
    } 
    left--; 
    } 
    shuffleArray(result); 
    return result; 
} 

function shuffleArray(arr) { 
    for (var i = arr.length - 1; i > 0; i--) { 
    var r = Math.floor(Math.random() * i); 
    var tmp = arr[i]; 
    arr[i] = arr[r]; 
    arr[r] = tmp; 
    } 
} 

Demo: http://jsfiddle.net/Guffa/wXsjz/

Смежные вопросы