질문을하고 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, 그리고 코드가 자바 스크립트의 버전입니다; 제 오류는 구문 적 오류가 아니라 논리적 오류라고 생각합니다.
나는이 코드를 너무 오래 꼼짝 않고 바라 보았다. 나는 분명히 뭔가 빠져있다.
아무도 도와 줄 수 있습니까?
http://jsfiddle.net/Guffa/wXsjz/ .. .in 루프는 수치 인덱스 배열을위한 루프입니다. 색인 변수를 사용하십시오. – Pointy
좋아요, 이것들을 색인으로 변환했습니다. 나는 아직도 충돌을 얻고 있지만 더 이상 중복은 없다! –
스크립트를 다소 단순화하려면 if (indecesArray.indexOf (number) <0)'을 사용하여 항목이 존재하지 않는지 확인하십시오. 때로는 편집자가 충돌한다고 말하면 왜 그런지 알 수 있습니까? 재귀 적 메서드 호출이 손에 닿지 않을 수 있습니까? (즉, 항상'doesntExist' 값이'false'가됩니다). 실제로 배열을 보았을 때 배열에'correctItem'이 있으면 항상 그렇게되지 않을까요? – Thor84no