我有两个带有一系列整数的数组。我想模拟反复切割一副牌以“洗牌”。我设置了一个切割位置并将数组A中切割之前的所有内容分配给数组B的开头。我意识到我需要使用切片来避免仅创建对数组A的引用,但是我可以在等式的两边使用切片,即arrayB.slice(0,3) = arrayA.slice(49,52)
?
答案 0 :(得分:2)
将任何内容分配给函数的返回值与在示例中一样,没有多大意义。
尝试查看 splice 方法,它应该可以满足您的需求。
示例:
var a = arrayA.splice(0,10); //remove the first 10 elements from arrayA and assign them to a
var b = arrayB.splice(0,10); //see above;
Array.prototype.push.apply(arrayA,b); //add the elements you removed from ArrayB to arrayA
Array.prototype.push.apply(arrayB,a); //see above.
答案 1 :(得分:0)
我不知道重复的扦插是否真的模仿了一个洗牌,但也许并不是你所做的一切。无论如何,根据我对你的描述的理解,你想要:
arrayB = arrayA.splice(49,52).concat( arrayB );
这应该会导致修改后的arrayB
具有从arrayA
之前移除的部分。
如果您不希望修改arrayA
,arrayB
不再包含arrayA
,那么您可以使用Array.prototype.slice()
代替Array.prototype.splice()
。
使用splice()
:
var a = [ 'a1', 'a2', 'a3', 'a4' ];
var b = [ 'b1', 'b2', 'b3', 'b4' ];
b = a.splice( 0, 2 ).concat( b );
// a is now: [ 'a3', 'a4' ]
// b is now: [ 'a1', 'a2', 'b1', 'b2', 'b3', 'b4' ]
在两个阵列上操作以使每个阵列从另一个阵列接收:
var a = [ 'a1', 'a2', 'a3', 'a4' ];
var b = [ 'b1', 'b2', 'b3', 'b4' ];
var removedFromA = a.splice( 0, 2 );
var removedFromB = b.splice( 0, 2 );
b = removedFromA.concat( b );
a = removedFromB.concat( a );
// a is now: [ 'b1', 'b2', 'a3', 'a4' ]
// b is now: [ 'a1', 'a2', 'b3', 'b4' ]
答案 2 :(得分:0)
如果您正在寻找一种洗牌的好方法,或者如果您想了解有关slice
的更多信息,我对您的问题并不是100%清楚。对于这个答案,我会假设前者。
实际上很容易得到像wrong这样看似简单的东西。 (错误的是,你的改组方法很容易产生偏差并使某些组合比其他组合更常见)。
更好的洗牌方法是使用像Fisher-Yates Shuffling Algorithm这样的算法。
我为我写的(在Javascript中)的纸牌游戏做了这个,这是我使用的代码:
// this.drawPile is an array of cards
var n = this.drawPile.length;
while (n > 1) {
n--;
var k = Math.floor((n + 1) * Math.random());
var temp = this.drawPile[k];
this.drawPile[k] = this.drawPile[n];
this.drawPile[n] = temp;
}
答案 3 :(得分:0)
虽然如果你想在改组甲板的两侧时模拟完全随机性,这并不是完全相关的,试试这个......
const shuffle = (arr1, arr2) => {
if(!(arr1 instanceof Array) || !(arr2 instanceof Array)) return [];
var ar1 = arr1.length >= arr2.length ? [...arr1] : [...arr2];
var ar2 = arr1.length >= arr2.length ? [...arr2] : [...arr1];
let x = 0;
for(let i = 0; i < ar1.length; i++) {
if(x > ar2.length-1) break;
ar1.splice(Math.floor(Math.random() * (ar1.length+1)), 0, ar2[x]);
x+=1;
}
return ar1;
};