【发布时间】: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