将数组元素随机分配到新数组

时间:2016-12-28 00:23:21

标签: javascript arrays random

我有一个从1到60的数字数组

var originalArray = [1, 2, 3, 4 .... 58, 59, 60] // etc

我想 - 取决于2到4之间的另一个数字 - 将这些数字随机分成指定的数组,并且结果每次都是唯一的。

例如:

distributeArray(2)应该会生成两个数组,每个数组都会从原始数组中随机选择30个数字。

distributeArray(3)应该会生成三个数组,每个数组都会从原始数组中随机选择20个数字。

我认为这是一个相当普遍的情况,所以任何指针都会受到赞赏。提前谢谢。

2 个答案:

答案 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;
&#13;
&#13;