說我有在javascript像是否有可能在陣列內部和陣列之間混洗對象?
[[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18]]
數組我可以隨機洗牌子陣的元素,得到這樣的
[[16,4,10],[8,3,9],[1,14,18],[2,5,7],[6,17,11],[12,13,15]]
編輯:所有的子陣列相同的長度。新的陣列將具有與舊陣列相同長度的子陣列。
說我有在javascript像是否有可能在陣列內部和陣列之間混洗對象?
[[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18]]
數組我可以隨機洗牌子陣的元素,得到這樣的
[[16,4,10],[8,3,9],[1,14,18],[2,5,7],[6,17,11],[12,13,15]]
編輯:所有的子陣列相同的長度。新的陣列將具有與舊陣列相同長度的子陣列。
function arrayShuffle(){
var tmp, rand;
for(var i =0; i < this.length; i++){
rand = Math.floor(Math.random() * this.length);
tmp = this[i];
this[i] = this[rand];
this[rand] =tmp;
}
}
Array.prototype.shuffle =arrayShuffle;
然後
for(var i in arrays){
arrays[i].shuffle()
}
同樣的事情頂層陣列內部陣列位置。
//編輯:Missreading :)
function shuffleAnyNumber (arrays) {
var numbers = new Array(); //collection of all numbers
for(var i in this){
for(var j in arrays[i]){
numbers.push(arrays[i][j]); //collect numbers out of the given arrays
}
}
numbers.shuffle(); //Method shown above
var output = new Array();
var tempArray= new Array();
//putting it together
for(var i in numbers){
if(tempArray.length == 3){
output.push(tempArray);
tempArray = new Array();
} else {
tempArray.push(numbers[i]);
}
}
return output;
}
我會說,它會像那個。
這看起來像只在每個子陣列內洗牌,它不會在子陣列之間洗牌。 – Barmar 2013-02-22 21:11:55
是的,我有點錯過。 但是,這將工作,通過收集所有數字到1陣列,洗牌,並把他們回到陣列的長度爲3. – 2013-02-22 21:13:31
你可以扁平化您陣列,shuffle it,然後再拆分起來:
var flat = [].concat.apply([], myArray);
arrayShuffle(flat);
var newArray = [],
sublen = myArray[0].length;
for (var i=0; i<flat.length; i+= sublen)
newArray.push(flat.slice(i, i+sublen));
或者你修改等植物學洗牌算法使用的物品從你的子陣之一。例如,費雪耶茨洗牌:
function shuffle2dArray(array) {
if (!array.length) return array;
var sublen = array[0].length,
len = array.length * sublen;
for (var i = len - 1; i > 0; i--) {
var j = Math.floor(Math.random() * (i + 1));
var ix = ~~(i/sublen),
iy = i % sublen,
jx = ~~(j/sublen),
jy = j % sublen;
var temp = array[ix][iy];
array[ix][iy] = array[jx][jy];
array[jx][jy] = temp;
}
return array;
}
我喜歡第一個解決方案,因爲我已經在我的代碼中展開該數組。 – devcoder 2013-02-22 21:29:20
這種慢騰騰的地方,它不會返回一個新的數組:
function shuffleMatrix (m) {
if (m.length == 0 || m[0].length == 0) {
// no rows or columns, just return it
return m;
}
function swap(i1, j1, i2, j2) {
if (i1 != i2 || j1 != j2) {
var temp = m[i1][j1];
m[i1][j1] = m[i2][j2];
m[i2][j2] = temp;
}
var rows = m.length;
var cols = m[0].length;
for (i = 0; i < rows; i++) {
for (j = 0; j < cols; j++) {
var new_i = Math.random()*rows;
var new_j = Math.random()*cols;
swap(i, j, new_i, new_j);
}
}
}
我會用強調這個:http://underscorejs.org/
v = [[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18]]
v2 = _.shuffle(_.flatten(v))
v3 = _.groupBy(v2, function(item, i) {
return i % v.length;
})
我100%贊同Ilan Berci的回答。不過,您可以使用下劃線以更實用的風格編寫它:
var v = [[1,2,3],[4,5,6],[7,8,9],[10,11,12],[13,14,15],[16,17,18]];
return _(v).chain().flatten().shuffle().groupBy(function(item, i) {
return i % v.length;
}).values().value();
Go下劃線!
哦,但s /下劃線/ [lodash](http://lodash.com/) – 2013-02-23 00:46:41
我完全贊同你的功能重寫! :) – 2013-02-23 00:46:44
你在這裏的邏輯是什麼? – tnanoba 2013-02-22 21:07:07
只是一個隨機洗牌? – 2013-02-22 21:08:01
這只是一個隨機重排,但保持相同的尺寸? – Barmar 2013-02-22 21:08:16