【问题标题】:Fisher–Yates Shuffle table rowsFisher-Yates 洗牌表行
【发布时间】:2013-10-26 05:36:17
【问题描述】:

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

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

在 JQuery 的帮助下,我有以下几点:

var parent = $("#parent");

function shuffleRows(parent) {
    var rows = parent.children();
    for (var i = rows.length - 1; i > 0; i--) {
        var j = Math.floor(Math.random() * (i + 1));
        var temp = rows[i];
        rows.eq(i - 1).after(rows[j]);
        rows.eq(j - 1).after(temp);
    }
}

shuffleRows(parent);

这里有一个工作示例:http://jsfiddle.net/98q9S/

但是,当我测试上述内容时,我不禁注意到A 行比其他行更频繁地获得首位,有时连续两次随机播放会产生确切的行序列。

不知道是不是我的实现有什么问题,还是只是我的样本量太小了。

【问题讨论】:

  • 按照编码,最后一行交换的几率是 1/6。第一行交换的几率是 5/6。最好将它们全部抓取,随机播放,然后重新应用,无需循环。

标签: javascript jquery algorithm shuffle


【解决方案1】:

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

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

【讨论】:

  • @eizs,谢谢。但是你的和我的有什么不同?您的解决方案基本上将 for 循环与 while 循环交换。
  • 我还有一个额外的动作。此外,每个位置都被打乱了。
猜你喜欢
  • 1970-01-01
  • 2017-07-08
  • 2023-03-27
  • 2021-09-04
  • 1970-01-01
  • 1970-01-01
  • 2011-01-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多