1

I am writing a web app that needs to be able to generate tournament schedules and brackets. When setting up initial pool play games, the current implementation I have will work correctly 50-75% of the time. But occasionally it will get stuck in an infinite loop because it will never randomly select the last seed needed.

e.g. if the only team left is team #5 that needs to be scheduled into the last game as the opponent, the random number generator will give me every possible option except seed number 5 which would be a seed of 4 for some reason.

Some of the code has been obfuscated obviously at this point in trying to pinpoint the source of my error but as of yet it has been to no avail, so thus my coming here.

Code:

teamPoolScheduled = [];
index = 0;
while (index < tournyTeams.length) {
    teamPoolScheduled[index] = [tournyTeams[index], 0];
    index++;
}
gamesScheduled = [];
var randomSeed = 0;
index = 0;
index2 = 0;
var index3 = 0;
var tempTeam1 = "";
var tempTeam2 = "";
var shouldAdd = true;
var index4 = 0;
var breakLoop = true;
while (index < parseInt(numPoolGames.innerHTML)) {
    randomSeed = Math.floor(Math.random() * tournyTeams.length);
    if (gamesScheduled[index] !== undefined && gamesScheduled[index].indexOf(tournyTeams[randomSeed]) >= 0) {
        continue;
    } else {
        if (teamPoolScheduled[randomSeed][1] < tournyPoolGames.value) {
            console.log("---------also here--------");
            if (gamesScheduled[index] === undefined) {
                gamesScheduled[index] = [];
            } else {
                index3 = 0;
                tempTeam1 = gamesScheduled[index][0];
                tempTeam2 = tournyTeams[randomSeed];
                shouldAdd = true;
                while (index3 < gamesScheduled.length) {
                    if ((gamesScheduled[index3][0] == tempTeam1 && gamesScheduled[index3][1] == tempTeam2) || (gamesScheduled[index3][1] == tempTeam1 && gamesScheduled[index3][0] == tempTeam2)) {
                        shouldAdd = false;
                        break;
                    }
                    index3++;
                }
                if (!shouldAdd) {
                    continue;
                }
            }
            if (shouldAdd) {
                gamesScheduled[index][index2] = tournyTeams[randomSeed];
                teamPoolScheduled[randomSeed][1] += 1;
                if (index2 == 1) {
                    index2 = 0;
                    index++;
                } else {
                    index2++;
                }
            }
        } else {
            console.log("Here seed: " + randomSeed);
            index4 = 0;
            breakLoop = true;
            while (index4 < teamPoolScheduled.length) {
                if (teamPoolScheduled[index4][1] != tournyPoolGames.value) {
                    breakLoop = false;
                    console.log(teamPoolScheduled[index4] + " index4: " + index4);
                    break;
                }
                index4++;
            }
            if (breakLoop) {
                break;
            }
        }
    }
}

The console log for one that executes correctly looks like this

---------also here--------
newTournamentScheduleController.js:165 Here seed: 5
newTournamentScheduleController.js:171 team1,2 index4: 0
4newTournamentScheduleController.js:135 ---------also here--------
newTournamentScheduleController.js:165 Here seed: 7
newTournamentScheduleController.js:171 team2,2 index4: 1
newTournamentScheduleController.js:135 ---------also here--------
newTournamentScheduleController.js:165 Here seed: 7
newTournamentScheduleController.js:171 team2,2 index4: 1
newTournamentScheduleController.js:135 ---------also here--------
newTournamentScheduleController.js:165 Here seed: 8
newTournamentScheduleController.js:171 team2,2 index4: 1
newTournamentScheduleController.js:135 ---------also here--------
newTournamentScheduleController.js:165 Here seed: 2
newTournamentScheduleController.js:171 team2,2 index4: 1
newTournamentScheduleController.js:165 Here seed: 0
newTournamentScheduleController.js:171 team2,2 index4: 1
newTournamentScheduleController.js:165 Here seed: 5
newTournamentScheduleController.js:171 team2,2 index4: 1
newTournamentScheduleController.js:165 Here seed: 0
newTournamentScheduleController.js:171 team2,2 index4: 1
newTournamentScheduleController.js:165 Here seed: 5
newTournamentScheduleController.js:171 team2,2 index4: 1
2newTournamentScheduleController.js:135 ---------also here--------
newTournamentScheduleController.js:165 Here seed: 4
newTournamentScheduleController.js:171 team4,1 index4: 3
newTournamentScheduleController.js:135 ---------also here--------
newTournamentScheduleController.js:165 Here seed: 7
newTournamentScheduleController.js:171 team4,1 index4: 3
newTournamentScheduleController.js:165 Here seed: 0
newTournamentScheduleController.js:171 team4,1 index4: 3
newTournamentScheduleController.js:165 Here seed: 0
newTournamentScheduleController.js:171 team4,1 index4: 3
newTournamentScheduleController.js:135 ---------also here--------
newTournamentScheduleController.js:165 Here seed: 0
newTournamentScheduleController.js:171 team4,2 index4: 3
newTournamentScheduleController.js:165 Here seed: 2
newTournamentScheduleController.js:171 team4,2 index4: 3
newTournamentScheduleController.js:165 Here seed: 8
newTournamentScheduleController.js:171 team4,2 index4: 3
newTournamentScheduleController.js:165 Here seed: 0
newTournamentScheduleController.js:171 team4,2 index4: 3
newTournamentScheduleController.js:165 Here seed: 1
newTournamentScheduleController.js:171 team4,2 index4: 3
newTournamentScheduleController.js:165 Here seed: 5
newTournamentScheduleController.js:171 team4,2 index4: 3
newTournamentScheduleController.js:165 Here seed: 4
newTournamentScheduleController.js:171 team4,2 index4: 3
newTournamentScheduleController.js:165 Here seed: 4
newTournamentScheduleController.js:171 team4,2 index4: 3
newTournamentScheduleController.js:165 Here seed: 2
newTournamentScheduleController.js:171 team4,2 index4: 3
newTournamentScheduleController.js:165 Here seed: 8
newTournamentScheduleController.js:171 team4,2 index4: 3
newTournamentScheduleController.js:165 Here seed: 7
newTournamentScheduleController.js:171 team4,2 index4: 3
newTournamentScheduleController.js:165 Here seed: 5
newTournamentScheduleController.js:171 team4,2 index4: 3
newTournamentScheduleController.js:165 Here seed: 4
newTournamentScheduleController.js:171 team4,2 index4: 3
newTournamentScheduleController.js:165 Here seed: 2
newTournamentScheduleController.js:171 team4,2 index4: 3
newTournamentScheduleController.js:165 Here seed: 7
newTournamentScheduleController.js:171 team4,2 index4: 3
newTournamentScheduleController.js:165 Here seed: 4
newTournamentScheduleController.js:171 team4,2 index4: 3
newTournamentScheduleController.js:165 Here seed: 0
newTournamentScheduleController.js:171 team4,2 index4: 3
newTournamentScheduleController.js:165 Here seed: 4
newTournamentScheduleController.js:171 team4,2 index4: 3
newTournamentScheduleController.js:165 Here seed: 9
newTournamentScheduleController.js:171 team4,2 index4: 3
newTournamentScheduleController.js:165 Here seed: 9
newTournamentScheduleController.js:171 team4,2 index4: 3
newTournamentScheduleController.js:165 Here seed: 9
newTournamentScheduleController.js:171 team4,2 index4: 3
newTournamentScheduleController.js:165 Here seed: 7
newTournamentScheduleController.js:171 team4,2 index4: 3
newTournamentScheduleController.js:165 Here seed: 9
newTournamentScheduleController.js:171 team4,2 index4: 3
newTournamentScheduleController.js:165 Here seed: 5
newTournamentScheduleController.js:171 team4,2 index4: 3
newTournamentScheduleController.js:165 Here seed: 8
newTournamentScheduleController.js:171 team4,2 index4: 3
newTournamentScheduleController.js:135 ---------also here--------
newTournamentScheduleController.js:165 Here seed: 8
newTournamentScheduleController.js:171 team7,2 index4: 6
newTournamentScheduleController.js:165 Here seed: 4
newTournamentScheduleController.js:171 team7,2 index4: 6
newTournamentScheduleController.js:165 Here seed: 2
newTournamentScheduleController.js:171 team7,2 index4: 6
newTournamentScheduleController.js:165 Here seed: 5
newTournamentScheduleController.js:171 team7,2 index4: 6
newTournamentScheduleController.js:165 Here seed: 7
newTournamentScheduleController.js:171 team7,2 index4: 6
newTournamentScheduleController.js:165 Here seed: 2
newTournamentScheduleController.js:171 team7,2 index4: 6
newTournamentScheduleController.js:135 ---------also here--------

and a portion of the infinite looping console log looks like this with thousands of lines more continuing onward in the same fashion and never hitting the --------also here------ log message.

Here seed: 9
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 1
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 6
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 6
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 1
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 1
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 2
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 3
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 1
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 1
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 8
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 3
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 1
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 1
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 5
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 0
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 3
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 7
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 7
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 2
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 8
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 6
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 0
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 2
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 2
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 7
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 1
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 5
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 0
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 0
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 9
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 0
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 9
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 0
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 7
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 5
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 6
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 5
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 1
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 8
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 6
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 1
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 1
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 1
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 2
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 1
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 8
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 9
newTournamentScheduleController.js:171 team5,2 index4: 4
newTournamentScheduleController.js:165 Here seed: 2
newTournamentScheduleController.js:171 team5,2 index4: 4

any help with an error in my syntax or logic or with known issues with the javascript math.random function would be greatly appreciated. Please ask if I can provide any additional details that could be beneficial.

  • 1
    So make a pool of teams, generate a random number, pull out the team from the pool. Continue until all the teams are removed from the pool. – epascarello Feb 09 '17 at 20:55
  • that is in essence what should be going on and thus the reason for the comparison teamPoolScheduled array. Why would popping/pushing items instead of having a secondary index array change my issue with random number seed generation? – throwSmartDev Feb 09 '17 at 21:04
  • 1
    you can't get duplicates (or nothing/errors) if you pop()... – dandavis Feb 09 '17 at 21:07
  • Um, you really should use a [standard simple shuffling algorithm](http://stackoverflow.com/q/2450954/1048572) instead of a while-loop. – Bergi Feb 09 '17 at 21:23
  • but since for instance this is scheduling teams for three games a piece, I need to be able to keep the previous value in the mix of potential options until it has been choosen 3 times. where as if they were popped they could not be choosen multiple times. – throwSmartDev Feb 09 '17 at 21:24
  • Bergi - i dont get why the shuffle algorithm would solve my issue seeing as it uses the exact logic i used, to generate its random numbers and a value within the defined range of Math.random not being pulled is my problem. – throwSmartDev Feb 09 '17 at 21:27
  • This is just me throwing in some ideas, maybe helpful or not. So I'm assuming you have an even number of teams, and you don't have any predicates on which team should be matched with another team. Why not put all your teams into one array, split it in half, so you have two equal arrays, shuffle both arrays, then each subsequent index from each of the two arrays would be matched. I feel like you're doing more than you should to solve a simple problem.. unless I'm missing something. – zsawaf Feb 09 '17 at 21:44
  • The number of teams could be even or odd, and in some cases the teams could all be weighted the same but in other cases they could be "seeded" like march madness style where they are pre-weighted for play – throwSmartDev Feb 09 '17 at 21:51
  • I admittingly thought this was a complicated way to achieve my desired result as well, but I did not see a way to accomplish this simply without adding contraints to the input data that would not be "acceptable" for my current project – throwSmartDev Feb 09 '17 at 21:54

0 Answers0