【问题标题】:Randomize an array of team names and return n number of teams随机化一组团队名称并返回 n 个团队
【发布时间】:2013-11-23 16:17:27
【问题描述】:

我一直在努力研究如何创建一个函数,该函数采用一组名称并将它们分成 n 个团队,团队中的所有名称都是随机的。

我可以这样做:

var numBig = size of the array % number of teams

var smallTeamSize = Math.floor(size of the array % number of teams)

最大的团队应该只比其他团队多一个名字。

因此,第一个 numBig 团队将拥有 smallTeamSize + 1 名称,其余团队将拥有 smallTeamSize 名称。

输入和输出应如下所示:

function randTeams(array, 3);

那么该函数可能(因为它是随机的)打印出以下内容:

Team 1: jimes, jim, joe
Team 2: jake, rob
Team 3: paps, richie

有什么建议吗?

我有一个随机化名称数组的函数:

var array = ['jim','jake','jimes','rob','paps','richie','joe'];

function shuffleArray(array) {

    for (var i = array.length - 1; i > 0; i--) {
        var j = Math.floor(Math.random() * i);
        var temp = array[i];
        array[i] = array[j];
        array[j] = temp;
    }
    return array;
}

var newarray =(shuffleArray(array));

我将如何将 newarray 纳入更小的团队?

【问题讨论】:

  • 将您的任务划分为子任务并分别处理它们。
  • 你能添加一个输入和有效输出的例子吗?
  • 你想传递一个名字数组,并让函数返回两个数组,一个用于每队球员?
  • 抱歉,我刚刚添加了输入和输出的样子

标签: javascript arrays list random split


【解决方案1】:

您可以将函数 splitTeams 添加到您的 shuffleArray

function splitTeams(names) {
    return {'team1': names.splice(0, Math.floor(names.length/2)),
        'team2': names}
}

并像这样使用它

var teams = splitTeams(shuffleArray(['jim','jake','jimes','rob','paps','richie']))

要组建多个团队,您可以使用 splitTeams 的这种变体:

function splitTeams(names, teams_count) {
    var teams = [];
    while (teams_count > 0) {
    teams.push(names.splice(0, Math.floor(names.length/teams_count)))
    teams_count--;
    }
    return teams
}

【讨论】:

    【解决方案2】:

    查看这段代码,它可以对数组进行洗牌并对其进行切片

    var names = ['jim','jake','jimes','rob','paps','richie'];
    names.sort(function(){
        return Math.round(Math.random()) - 0.5;
    });
    var noOfTeams = 3;
    var totalTeams = Math.ceil(names.length/noOfTeams);  
    
    var i,j,temparray,chunk = totalTeams;
    for (i=0,j=names.length; i<j; i+=chunk) {
        temparray = names.slice(i,i+chunk);
        console.log(temparray);
    }
    

    见 fiddle http://jsfiddle.net/abhiklpm/QDF5J/ ,在控制台中你会看到随机数组

    【讨论】:

      【解决方案3】:

      我写这篇文章的前提是你想取一组名字,并从这些名字中创建两个团队(尽管你的问题显然没有明确表示):

      function createTeams(names) {
          var team1 = [],
              n;
          for (var i = 0, len = Math.floor(names.length / 2); i < len; i++) {
              n = Math.floor(Math.random() * names.length);
              team1.push(names[n]);
              names.splice(n, 1);
          }
          return {
              'team1': team1,
                  'team2': names
          };
      }
      
      var teams = createTeams(['James', 'Bill', 'William', 'Jack', 'Steve']),
          team1 = teams.team1,
          team2 = teams.team2;
      
      console.log(team1, team2); // ["Steve", "William"] ["James", "Bill", "Jack"]
      

      JS Fiddle demo.

      已编辑,包括创建任意数量的团队的有点混乱的方法:

      function createTeams(names, numTeams) {
          if (!names || typeof names == 'number'){
              return false;
          }
          else {
              numTeams = typeof numTeams == 'undefined' ? 2 : Math.abs(parseInt(numTeams,10));
              var teams = {},
                  perTeam = Math.floor(names.length/numTeams),
                  n;
              for (var i = 0; i < numTeams; i++){
                  teams[i] = [];
              }
              while (names.length - perTeam > 0){
                  for (var i = 0; i < numTeams; i++){
                      n = Math.floor(Math.random() * names.length);
                      if (names.length >= 0 && typeof names[n] !== 'undefined'){
                          teams[i].push(names[n]);
                          names.splice(n,1);
                      }
                  }
              }
              return teams;
          }
      }
      
      var teams = createTeams(['James', 'Bill', 'William', 'Jack', 'Steve'], '5');
      
      console.log(teams);
      
      /*
          {
              '0' : ['Steve'],
              '1' : ['James'],
              '2' : ['Bill'],
              '3' : ['Jack'],
              '4' : ['William']
          }
      */
      

      JS Fiddle demo.

      参考资料:

      【讨论】:

      • 所以这将我的数组分成两个团队。你会怎么做才能指定你想要多少个团队?
      • 我不确定您的第二个功能是否有效。如果我将 9 个名字传递给它,以 4 个团队作为参数,它会给我 4 个团队,每团队 2 个,缺少 1 个人
      【解决方案4】:

      一旦你有了你的随机数组,就很容易将玩家“分配”到任何你想要的数字:

      function distributePlayers(names, numberOfTeams) {
          var ret = {};
          var teamCounter = 0;
      
          for (var i = 0; i < names.length; ++i) {
              if (!ret["array" + teamCounter]) {
                  ret["array" + teamCounter] = [];
              }
              ret["array" + teamCounter].push(names[i]);
              if (++teamCounter == numberOfTeams) {
                  teamCounter = 0;
              }
          }
          return ret;
      }
      

      那么你只需要:

      var newArray = shuffleArray(array);
      var arrays = distributePlayers(newArray, numberOfTeams);
      

      arrays 内部将是成员 array1、array2 ... arrayN。

      工作Fiddle

      更新

      要遍历return,遍历对象自身的所有属性,在每一个属性中,加入数组得到全队:

      for (var property in arrays) {
          // check to make sure you didn't stumble on an inherited property
          if (arrays.hasOwnProperty(property)) {
              var str = property + ": " + arrays[property].join(", ");
              console.log(str);
          }
      }            
      

      这将产生输出:

      array0: richie, jimes, rob
      array1: joe, jim
      array2: paps, jake
      

      如果您想重命名数组以反映团队名称,只需更改 for 循环内的 if distributePlayers

      if (!ret["Team" + (teamCounter + 1)) {
          ret["Team" + (teamCounter + 1));
      }
      ret["Team" + (teamCounter + 1)].push(names[i]);
      

      这样,您的数组名称将真正反映有用的信息。

      Updated fiddle

      【讨论】:

      • 好的,所以这将返回一个具有多个数组属性的对象,然后返回该对象。我怎样才能让它通过并打印出每个数组属性?所以输出看起来像Team 1: jimes, jim, joeTeam 2: jake, robTeam 3: paps, richie
      猜你喜欢
      • 1970-01-01
      • 2016-10-11
      • 2020-11-20
      • 2017-08-15
      • 1970-01-01
      • 1970-01-01
      • 2014-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多