如果我正确理解了问题陈述,那么您所拥有的是要求改组算法的基本变体。您需要来自起始数组的两个元素,无需替换。
最有效的洗牌算法是所谓的 Fisher-Yates 洗牌,它的复杂度为 n 阶——也就是说,它所花费的时间和空间与您正在使用的元素数量大致成正比。它的工作原理是在数组中取一个随机元素并将其与第一个元素交换;然后,它在第一个之后的数组中取一个随机元素,并与第二个交换;等等。你得到一个完美的(伪)随机数组,每个元素都需要一个逻辑操作。
如果你打乱数组,然后从中取出前两个元素,你可以在两个 div 中显示它们。
Mike Bostocks很好地实现了 Fisher-Yates shuffle:
function shuffle(array) {
var m = array.length, t, i;
// While there remain elements to shuffle…
while (m) {
// Pick a remaining element…
i = Math.floor(Math.random() * m--);
// And swap it with the current element.
t = array[m];
array[m] = array[i];
array[i] = t;
}
return array;
}
如果我们scn
通过它运行您的数组,然后将前两个元素放入 div 中,您将拥有所需的内容。
<script type="text/javascript">
var scn = ["red", "blue", "green", "yellow"]; // or whatever array, doesn't matter
$(document).ready(function() {
shuffle(scn);
$('#t1').html(scn[0]);
$('#t2').html(scn[1]);
});
// insert shuffle function code here
</script>
天真的方法是从 1-4 中取一个随机数两次,确保它们不相等,然后从数组中提取元素,但是如果你打算在游戏中使用这个代码,一个洗牌算法更具可扩展性——只需调整数组的大小和要插入的 div,您就可以拥有一组任意大小。