我正在编写一个函数来随机排列数组中的项目:
this.shuffle = function () {
...
首先,我得到数组的两半并设置第三个空数组:
this.leftHalf = this.cards.slice(0, this.size() / 2);
this.rightHalf = this.cards.slice(this.size() / 2);
this.result = [];
接下来,我将每一半中的一张牌放入结果数组中:
for (var i = ...) {
this.result.unshift(this.leftHalf[i]);
this.result.unshift(this.rightHalf[i]);
}
最后,我将结果数组分配给原始数组并删除“临时”变量:
this.cards = this.result;
delete this.leftHalf;
delete this.rightHalf;
delete this.result;
}
我的问题:这是解决这个问题的明智方法,还是有更好的方法而不涉及设置临时变量?我考虑过使用私有(private)变量(但不确定它是否会提高性能),如下所示:
var leftHalf, rightHalf, result;
this.shuffle = function () {
leftHalf = ...
只是好奇我是否做错了什么明显的事情,或者在这些情况下是否有最佳实践。
最佳答案
你可以在没有任何私有(private)变量和一个循环的情况下完成它,尽管我怀疑会有很大的性能差异。假设您想要左手洗牌,因此顶部的牌最终位于顶部,中间的牌位于第二位,并且牌组的长度为偶数 N...
for(var i=...) {
if(i%2 == 1)
newdeck[i] = oldeck[N/2+(i-1)/2];
if(i%2 == 0)
newdeck[i] = oldeck[i/2];
}
这将像您的原始算法一样进行所谓的完美洗牌,但正如人们所说,这不是随机的,因为它是可预测的。有一篇著名的论文说,要从有序的牌组中得到看似随机的牌组,您需要进行 7 次完美的洗牌。您还可以使用左右洗牌来控制牌组中的牌,如 this article 所示。 .
关于javascript - 在 for 循环中使用临时变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11712804/