2012-07-06 2 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, 그리고 코드가 자바 스크립트의 버전입니다; 제 오류는 구문 적 오류가 아니라 논리적 오류라고 생각합니다.

나는이 코드를 너무 오래 꼼짝 않고 바라 보았다. 나는 분명히 뭔가 빠져있다.
아무도 도와 줄 수 있습니까?

+3

http://jsfiddle.net/Guffa/wXsjz/ .. .in 루프는 수치 인덱스 배열을위한 루프입니다. 색인 변수를 사용하십시오. – Pointy

+0

좋아요, 이것들을 색인으로 변환했습니다. 나는 아직도 충돌을 얻고 있지만 더 이상 중복은 없다! –

+0

스크립트를 다소 단순화하려면 if (indecesArray.indexOf (number) <0)'을 사용하여 항목이 존재하지 않는지 확인하십시오. 때로는 편집자가 충돌한다고 말하면 왜 그런지 알 수 있습니까? 재귀 적 메서드 호출이 손에 닿지 않을 수 있습니까? (즉, 항상'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; 
    } 
} 

데모 : 음 우선가`사용하지 않는위한

관련 문제