【问题标题】:Distributing array elements randomly to new arrays将数组元素随机分配到新数组
【发布时间】:2016-12-28 00:23:20
【问题描述】:

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

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

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

例如:

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

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

我认为这是一个相当常见的情况,因此任何指针都会受到赞赏。提前致谢。

【问题讨论】:

标签: javascript arrays random


【解决方案1】:

你可以这样做,首先洗牌,然后将数组拆分为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)))

【讨论】:

    【解决方案2】:

    您可以创建一个函数,该函数创建一个 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)
    );

    【讨论】:

      猜你喜欢
      • 2013-11-14
      • 1970-01-01
      • 1970-01-01
      • 2011-04-18
      • 1970-01-01
      • 2017-02-14
      • 2018-02-07
      • 1970-01-01
      • 2021-04-28
      相关资源
      最近更新 更多