我有一个从1到60的数字数组
var originalArray = [1, 2, 3, 4 .... 58, 59, 60] // etc
我想 - 取决于2到4之间的另一个数字 - 将这些数字随机分成指定的数组,并且结果每次都是唯一的。
例如:
distributeArray(2)
应该会生成两个数组,每个数组都会从原始数组中随机选择30个数字。
distributeArray(3)
应该会生成三个数组,每个数组都会从原始数组中随机选择20个数字。
我认为这是一个相当普遍的情况,所以任何指针都会受到赞赏。提前谢谢。
答案 0 :(得分:0)
你可以这样做,首先洗牌,然后将数组拆分成n
部分。
var arr = [...Array(61).keys()].slice(1)
function splitRandom(data, n) {
var seen = [];
var counter = 0;
var shuffle = data.reduce(function(r, e) {
function random() {
var rand = parseInt(Math.random(0, arr.length) * arr.length);
if (seen.indexOf(rand) != -1) {
return random()
} else {
seen.push(rand)
return rand;
}
}
r[random()] = e;
return r;
}, [])
var split = shuffle.reduce(function(r, e) {
var c = counter++;
r[c] = r[c].concat(e)
counter = counter % n;
return r;
}, Array(n).fill([]))
return split;
}
console.log(JSON.stringify(splitRandom(arr, 3)))
console.log(JSON.stringify(splitRandom(arr, 10)))
console.log(JSON.stringify(splitRandom(arr, 50)))

答案 1 :(得分:0)
您可以创建一个创建n
.length
数组的函数,以及一个x
.length
数组。使用do..while
循环Array.prototype.splice()
删除originalArray
,.push()
元素到x
个随机数组之一的随机索引,直到originalArray.length
计算到false
,返回包含值的数组数组。
const randomArrays = (n, x) => {
let [originalArray, result, len] = [
Array.from({length: n}, (_, key) => key)
, Array.from({length: x}, () => [])
, Math.ceil(n / x)
];
do {
let [curr, index] = [
originalArray
.splice(Math.floor(Math.random() * originalArray.length), 1)
.pop()
, Math.floor(Math.random() * result.length)
];
if (result[index].length < len)
result[index].push(curr);
else
for (let i = 0; i < result.length; i++) {
if (result[i].length < len) {
result[i].push(curr);
break;
}
}
} while (originalArray.length);
return result
}
console.log(
randomArrays(60, 3)
, randomArrays(21, 7)
, randomArrays(5, 3)
, randomArrays(27, 5)
);
&#13;