【问题标题】:How to write a fairness algorithm in Javascript using circular arrays?如何使用循环数组在 Javascript 中编写公平算法?
【发布时间】:2014-03-14 04:48:16
【问题描述】:

我孩子的棒球队有 13 个孩子。每个孩子都应该轮流完成这些位置,以便他们在每个位置上都获得相同的时间。顺便说一下,我们有 4 名外野手,因为这些孩子只有 7 岁。

我尝试编写一个小的 Javascript 算法来公平地旋转它们。我想出了以下内容,但它似乎并不像我想象的那么公平,而且令人困惑。我相信有一个更简单的方法。有什么建议吗?

var people = new Array("Amelie","Avery","Brennan","Clayton","Devin","Flynn","Haydn","Jack","Kai","Liam","Max","Maxi","Sterling");
    var people_copy = people.slice(0);
    var jobs = new Array("Pitcher","Catcher","Third Base","Short Stop","Second Base","First Base","Right Field","Ctr Right","Ctr Left","Left");
    var jobs_copy = jobs.slice(0);
    var result_set = new Array();

    for(i=0;i<jobs_copy.length;i++){
        j = i%jobs.length;
        result_set[j] = new Object();
          for(h=0;h<people_copy.length;h++){
                  if((jobs[0]) && (people[0])){
                    jobby = jobs[0].trim();
                    persony = people[0].trim();
                    result_set[j][jobby] = persony; 
                  }
                  var shifted = people.shift();
                  people.push(shifted);

                  var jobs_shifted = jobs.shift();
                  jobs.push(jobs_shifted);    
            }
            var shifted = people.shift();
            people.push(shifted);
          }

    for(i=0;i<result_set.length;i++){

        console.log("\nIteration: " + (i+1));

        for(h=0;h<jobs_copy.length;h++){
            l = jobs_copy[h];
            console.log(l + '=' + result_set[i][l]);

        }
    }

【问题讨论】:

  • 为什么不创建两个列表(球员、工作),然后轮换其中一个列表...?即jobs = [a, b, c]players = [1, 2, 3],然后下周,jobs = [b, c, a]players = [1, 2, 3]
  • 因为你的工作可能比玩家少,反之亦然。

标签: javascript arrays circular-buffer


【解决方案1】:
// Init the list.
var people = ["Amelie","Avery","Brennan","Clayton","Devin","Flynn","Haydn","Jack","Kai","Liam","Max","Maxi","Sterling"];
var jobs = ["Pitcher","Catcher","Third Base","Short Stop","Second Base","First Base","Right Field","Ctr Right","Ctr Left","Left"];

for (var c=people.length; c>0; c--) {
    var firstToLast = people[0]; // Backup first value
    people.shift (); // Remove from the list 
    people.push(firstToLast); // Append the name to the end
    console.log (people); // ["Avery", "Brennan", "Clayton", "Devin", "Flynn", "Haydn", "Jack", "Kai", "Liam", "Max", "Maxi", "Sterling", "Amelie"]

    // To print a list of jobs
    for (var i=0; i<jobs.length; i++) {
        console.log (people[i] + ': ' + jobs[i]);
    }
    console.log ('-----');
}

如果您只想轮换人员列表,这应该可以完成工作。

编辑:添加循环。

【讨论】:

  • 那里缺少一个循环 - 我想展示让每个人完成每项工作所需的尽可能多的迭代。
  • 循环添加到答案:3
  • 就是这样!有趣的是,在我获得更多声望点之前,我无法投票。可惜。谢谢。
【解决方案2】:

由于玩家多于工作,我已将 Not playing 工作添加到您的数组中,以便我们可以简单地轮换工作并让所有内容排列整齐。

下面是一个简单的解决方案,将作业数组旋转指定的数字:

var people = ["Amelie", "Avery", "Brennan", "Clayton", "Devin", "Flynn", "Haydn", "Jack", "Kai", "Liam", "Max", "Maxi", "Sterling"];
var jobs = ["Pitcher", "Catcher", "Third Base", "Not playing", "Short Stop", "Second Base", "First Base", "Not playing", "Right Field", "Ctr Right", "Ctr Left", "Left", "Not playing"];


function getPositions(gameNumber) {
    for (var i = 0; i < people.length; i++) {
        console.log("Player: " + people[i] + ", " + jobs[(i + gameNumber) % jobs.length]);
    }
}

如果您想玩 10 场游戏,请调用该函数 10 次,并使用范围为 1-10 的 gameNumber 参数。

您还可以对初始玩家数组进行洗牌,以确保一切公平。更多信息:How can I shuffle an array?

【讨论】:

  • 如果我们得到一个新玩家,或者缩小工作量,算法应该“正常工作”,而不必添加诸如“不玩”之类的东西。
  • 我喜欢上面吉迅的解决方案:)
  • @Mreider,我希望你知道你选择的解决方案会让同一个人连续三场比赛都坐在板凳上。 :)
猜你喜欢
  • 1970-01-01
  • 2014-03-17
  • 2017-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-11
相关资源
最近更新 更多