繁体   English   中英

在JavaScript中使用单个预定义选项创建随机数组

[英]Creating A Randomised Array with a Single Pre-defined Choice in JavaScript

我正在创建一个程序,它将问一个问题并给出5个选择答案。
一个是预定义的并且是正确的,其他的我想从一堆答案中随机选择,整个数组也都应该洗牌。

我写了一些东西,但是有一些不一致之处。
例如,有时预定义的选项会在列表中出现两次(似乎跳过了我的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的版本。 我认为我的错误是逻辑错误,而不是句法错误。

我觉得我盯着这段代码已经太久了,而我却缺少明显的东西。
有谁能够帮助我?

您可以遍历这些选项并确定应将其包括在内的可能性,然后对包含的选项进行洗牌:

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;
  }
}

演示: http//jsfiddle.net/Guffa/wXsjz/

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM