我有一个包含元素的数组,例如:
var one = [1span,2span,3span,4span,5span,6span,7span];
var two = [1span,2span,3span,4span,5span,6span,7span];
var three = [1span,2span,3span,4span,5span,6span,7span];
var ...till seven.
var total = [one,two,three ..till 7]因此,我们基本上有7个数组,total variable将为所有7个数组中的每个数组显示7个元素。
现在,我有了一个函数,它应该在每个部分用不同的数字填充我的变量,从1到7。
var bar = [1, 2, 3, 4, 5, 6, 7];
for(var j=0; j<total.length; j++) {
Array.from(total[j]).forEach(function(e, i, a) {
e.textContent = bar[Math.round(Math.random()*(bar.length-1))];
console.log(e,i,k);
});
}很好,我的函数做到了这一点,但不幸的是,span元素使用来自bar variable的值填充,每个变量来自total var,每次填充7次,每个变量只填充一次。
所以我的问题是:
total var的值填充bar array中的每个变量一次。发布于 2016-08-19 08:04:08
您可以使用给定数组的副本并生成不重复的随机项。
function generate(count, values) {
return Array.apply(null, { length: count }).map(function () {
var r = [],
array = values.slice();
while (array.length) {
r.push(array.splice(Math.floor(Math.random() * array.length), 1)[0]);
}
return r;
});
}
console.log(generate(7, [1, 2, 3, 4, 5, 6, 7]));
随机化单个数组
function generate(values) {
var r = [],
array = values.slice();
while (array.length) {
r.push(array.splice(Math.floor(Math.random() * array.length), 1)[0]);
}
return r;
}
console.log(generate([1, 2, 3, 4, 5, 6, 7]));
发布于 2016-08-19 09:12:59
如果我们想把这个问题推广到一个N维数组的一般情形中,那么一个可重用的方法如下;
我们将使用两个我非常喜欢使用的泛型函数:Array.prototype.clone()和Array.prototype.shuffle()。我们的arrayND函数有不确定的参数数。最后一个参数将指定要填充的随机整数的最小(基)。以前的参数将给出每个维度的长度。因此,在特殊情况下,由于我们需要一个2D 7x7矩阵来填充随机但唯一的数字,从1开始,我们将调用我们作为arrayND(7,7,1)的函数。
Array.prototype.shuffle = function(){
var i = this.length,
j;
while (i > 1) {
j = ~~(Math.random()*i--);
[this[i],this[j]] = [this[j],this[i]];
}
return this;
};
Array.prototype.clone = function(){
return this.map(e => Array.isArray(e) ? e.clone() : e);
};
function arrayND(...n){
return n.reduceRight((p,c) => c = Array(...Array(c)).map((e,i) => Array.isArray(p) ? p.clone().shuffle() : i+p));
}
var arr = arrayND(7,7,1);
console.log(arr);
发布于 2016-08-19 13:28:03
由于您希望将这些数组放在一起处理,所以应该将它们放在一个数据结构中:
var spans = [ one, two, tree, ..., seven ]现在,您想要一个不重复的随机顺序,将可能的索引放入Array并对其进行洗牌:
var indices = [0,1,2,3,4,5,6];还有一些洗牌的人:
function shuffle(arr){
for(var i=arr.length, j, tmp; i-- > 1; ){
tmp = arr[j = 0|(Math.random()*i)];
arr[j] = arr[i];
arr[i] = tmp;
}
return arr;
}现在,如果您想要节点总数:
var total = shuffle(indices).map((index, n) => spans[n][index]);至少就我理解你的问题/代码/意图而言。
https://stackoverflow.com/questions/39033784
复制相似问题