为测验应用程序洗牌2个以上的数组

shuffle more than 2 array for quiz application?

本文关键字:数组 2个 应用程序      更新时间:2023-09-26

我需要随机显示问题以及相应的选择和答案。为此,我有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;
}

你能告诉我,实现的最佳方法是什么吗

您可以使用与用于单个数组的方法相同的方法来混洗多个数组。毕竟,您不是在看内容,而是在看数组索引。

首先,让我们稍微重写一下您的函数,使其返回一个副本并保持输入数组不变。它还将交换中继到一个额外的功能:

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]);

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