Javascript 费希尔–;耶茨洗牌表行

Javascript 费希尔–;耶茨洗牌表行,javascript,jquery,algorithm,shuffle,Javascript,Jquery,Algorithm,Shuffle,我打算使用Fisher-Yates shuffle来洗牌给定表的现有行,例如: <table> <tbody id="parent"> <tr id="node1"> <td>1</td> <td>A</td> </tr> <tr id="node2"> <

我打算使用Fisher-Yates shuffle来洗牌给定表的现有行,例如:

<table>
    <tbody id="parent">
        <tr id="node1">
            <td>1</td>
            <td>A</td>
        </tr>
        <tr id="node2">
            <td>2</td>
            <td>B</td>
        </tr>
        <tr id="node3">
            <td>3</td>
            <td>C</td>
        </tr>
        <tr id="node4">
            <td>4</td>
            <td>D</td>
        </tr>
        <tr id="node5">
            <td>5</td>
            <td>E</td>
        </tr>
        <tr id="node6">
            <td>6</td>
            <td>F</td>
        </tr>
    </tbody>
</table>
下面是一个工作示例:

然而,当我测试上述内容时,我不得不注意到,行
A
比其他行更经常地获得顶部位置,有时两次连续的洗牌会产生精确的行序列


我想知道我的实现中是否有什么错误,或者只是我的样本太小。

我在使用该算法制作的玩具应用程序中发现了类似的东西。我最终选择了在这个网站上找到的另一个解决方案。我希望这有助于:

makeArrRandom = function(array) {

  var counter = array.length, temp, index;
  while (counter > 0) {
    index = Math.floor(Math.random() * counter);
    counter--;
    temp = array[counter];
    array[counter] = array[index];
    array[index] = temp;
  }
  return array;
};

按照编码,最后一行交换的几率为1/6。首行互换的几率为5/6。最好抓取它们,洗牌,然后重新应用,不需要循环。@eizs,谢谢。但是你的和我的有何不同呢?你的解决方案基本上是用while循环替换for循环。我的解决方案中还有一个额外的动作。此外,每个位置都会被洗牌。
makeArrRandom = function(array) {

  var counter = array.length, temp, index;
  while (counter > 0) {
    index = Math.floor(Math.random() * counter);
    counter--;
    temp = array[counter];
    array[counter] = array[index];
    array[index] = temp;
  }
  return array;
};