用JavaScript中的混音算法跟踪索引



我有一个简单的字符串,看起来像下面的一个和相应的新数组。我需要实现的是用简单的洗牌算法(如下面的一个)将简单的数组洗净简单的数组,但是我需要相应的新数组才能用相同的精确随机散装洗牌,这是每个索引的结果将是相同的。这可能会令人困惑,因此请查看下面的示例输出,并且应该变得清晰。Fisher-Yates Shuffle是否可以使用这种类型的算法?

小提琴:这里

之前:

var simple_arr = ["701", "702", "703", "704", "705", "706", "707", "708"];
var new_arr = ["A1","A2","A3","A4","A5","A6","A7","A8"];

之后:

var after_simple_arr = ["701", "708", "702", "705", "703", "706", "704", "707"];
var after_new_arr = ["A1","A8","A2","A5","A3","A6","A4","A7"];

Fisher-Yates Shuffle算法:

function shuffle(array) {
  var currentIndex = array.length, temporaryValue, randomIndex;
  // While there remain elements to shuffle...
  while (0 !== currentIndex) {
    // Pick a remaining element...
    randomIndex = Math.floor(Math.random() * currentIndex);
    currentIndex -= 1;
    // And swap it with the current element.
    temporaryValue = array[currentIndex];
    array[currentIndex] = array[randomIndex];
    array[randomIndex] = temporaryValue;
  }
  return array;
}

您可以洗牌索引数组,然后将其用作您关心的两个阵列的索引:

var ids = [];
for (var i = 0; i < simple_arr.length; i++) {
    ids.push(i);
}
ids = shuffle(ids);
var dat1 = [];
var dat2 = [];
for (var i = 0; i < ids.length; i++) {
    dat1.push(simple_arr[ids[i]]);
  dat2.push(new_arr[ids[i]]);
}
console.log("shuffled simple_arr: ", dat1);
console.log("shuffled new_arr: ", dat2);

只是将索引阵列 indices = [0, 1, 2, ...]随机改组,然后使用它来访问通过 array[indices[i]]

最新更新