为测验申请洗牌超过2个数组?

时间:2015-03-25 12:27:00

标签: javascript arrays algorithm

我需要随机显示问题以及相应的选择和答案。为此,我有3个阵列,

1)array1用于提问

2)array2用于选择

3)数组3用于答案

例如:

var questions = [
    "q1",
    "q2",
    "q3",
    "q4",
];
var choices = [
    [
        "choice1",
        "choice2",
        "choice3",
        "choice4"
    ],
    [
        "choice1",
        "choice2",
        "choice3",
    ],
    [
        "choice1",
        "choice2",
        "choice3",
    ],
    [
        "choice1",
        "choice2",

    ],
    [
        "choice1",
        "choice2",
        "choice3",
        "choice4"
    ],
];


 var answers = [
    [1,1,0,1],
    [0,1,0],
    [0,1],
    [1,1,1,0],

];

我有下面的代码,对单个数组工作正常,但我想为多个数组实现相同的方法。

function shuffle(source){
   var l=source.length-1;
   for(var i=l; i>0; i--){
       var itemIndex=Math.floor(Math.random()*(i+1));
       var item=source[i];
         source[i] = source[itemIndex];
         source[itemIndex]=item;
   }
   return source;
}

请您告诉我,实现这一目标的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

您可以使用与单个阵列相同的方法来混洗许多阵列。毕竟,你不是仅仅在数组索引处使用内容。

首先,让我们稍微重写一下你的函数,这样它就会返回一个副本并保持输入数组不变。它还将交换转发到一个额外的功能:

function swap(arr, i, j)
{
    var s = arr[i];
    arr[i] = arr[j];
    arr[j] = s;
}

function shuffle(arr) {
    var l = arr.length;

    arr = arr.concat([]);        // Make a copy

    while (l--) {
        var j = Math.floor(Math.random() * l);
        swap(arr, j, l);
    }

    return arr;
}

我们现在可以对数组数组上的单个数组操作执行所有操作:

function shuffleMany(arr) {
    if(arr.length == 0) return [];

    var l = 0;

    for (var i = 0; i < arr.length; i++) {
        if (i == 0) l = arr[i].length;
        if (arr[i].length != l) return undefined;
        arr[i] = arr[i].concat([]);
    }       

    while (l--) {
        var j = Math.floor(Math.random() * l);

        for (var i = 0; i < arr.length; i++) {
            swap(arr[i], j, l);
        }
    }

    return arr;
}

无论我们在第一个版本中使用arr,我们现在都在循环中使用arr[i]。必须注意确保所有数组的长度相同,但除此之外,它很简单:对所有数组使用相同的交换索引:

使用如下功能:

var array = [
    ["A", "B", "C", "D", "E", "F"],
    ["1", "2", "3", "4", "5", "6"],
    [0, 1, 2, 3, 4, 5],
];

var x = shuffleMany(array);
console.log(x[0]);
console.log(x[1]);
console.log(x[2]);

最后,正如评论者已经告诉过你的那样,解决方案是将所有属于一起的东西保存在一起,即重新组织你的数组。然后排序和混洗成为顶级数组的简单操作。