0

I am working on a project in JavaScript where I must generate 24 random and different numbers from 1-24. Whenever I run this code, I get this error in Safari, Firefox, and Chrome RangeError: Maximum Call Stack Size Exceeded. I don't have much experience/knowledge about the call stack, but I do know that if there are too many instructions/recursions run, it will give you an error. If you are looking at the code below, note that the error happens when you look at the if statement in the function generated24()

I have already found a few other solutions for other people, but I don't quite understand how to apply them in my situation. I have already tried a few other very basic things, such as splitting it into two if statements/functions, but it still gives the same error. I am still new to JS and don't have full knowledge of it, so please don't get angry if I sound like I have no idea what I am talking about. Thank you for any help!

Here is the code I was working on. I removed a few things that aren't necessary.

let d1 = 0
let d2 = 0
let d3 = 0
let d4 = 0
let d5 = 0
let d6 = 0
let d7 = 0
let d8 = 0
let d9 = 0
let d10 = 0
let d11 = 0
let d12 = 0
let d13 = 0
let d14 = 0
let d15 = 0
let d16 = 0
let d17 = 0
let d18 = 0
let d19 = 0
let d20 = 0
let d21 = 0
let d22 = 0
let d23 = 0
let d24 = 0

function getRandomInt(max) {
    return Math.floor(Math.random() * max);
}

function generated1() {
    d1 = getRandomInt(24)
    if (d1 == 0) {
        generated1()
    } else {
        generated2()
    }
}

function generated2() {
    d2 = getRandomInt(24)
    if (d2 == d1) {
        generated2()
    } else if (d2 == 0) {
        generated2()
    } else {
        generated3()
    }
}

function generated3() {
    d3 = getRandomInt(24)
    if (d3 == d2 || d3 == d1 || d3 == 0) {
        generated3()
    } else {
        generated4()
    }
}

function generated4() {
    d4 = getRandomInt(24)
    if (d4 == d3 || d4 == d2 || d4 == d1 || d4 == 0) {
        generated4()
    } else {
        generated5()
    }
}

function generated5() {
    d5 = getRandomInt(24)
    if (d5 == d4 || d5 == d3 || d5 == d2 || d5 == d1 || d5 == 0) {
        generated5()
    } else {
        generated6()
    }
}

function generated6() {
    d6 = getRandomInt(24)
    if (d6 == d5 || d6 == d4 || d6 == d3 || d6 == d2 || d6 == d1 || d6 == 0) {
        generated6()
    } else {
        generated7()
    }
}

function generated7() {
    d7 = getRandomInt(24)
    if (d7 == d6 || d7 == d5 || d7 == d4 || d7 == d3 || d7 == d2 || d7 == d1 || d7 == 0) {
        generated7()
    } else {
        generated8()
    }
}

function generated8() {
    d8 = getRandomInt(24)
    if (d8 == d7 || d8 == d6 || d8 == d5 || d8 == d4 || d8 == d3 || d8 == d2 || d8 == d1 || d8 == 0) {
        generated8()
    } else {
        generated9()
    }
}

function generated9() {
    d9 = getRandomInt(24)
    if (d9 == d8 || d9 == d7 || d9 == d6 || d9 == d5 || d9 == d4 || d9 == d3 || d9 == d2 || d9 == d1 || d9 == 0) {
        generated9()
    } else {
        generated10()
    }
}

function generated10() {
    d10 = getRandomInt(24)
    if (d10 == d9 || d10 == d8 || d10 == d7 || d10 == d6 || d10 == d5 || d10 == d4 || d10 == d3 || d10 == d2 || d10 == d1 || d10 == 0) {
        generated10()
    } else {
        generated11()
    }
}

function generated11() {
    d11 = getRandomInt(24)
    if (d11 == d10 || d11 == d9 || d11 == d8 || d11 == d7 || d11 == d6 || d11 == d5 || d11 == d4 || d11 == d3 || d11 == d2 || d11 == d1 || d11 == 0) {
        generated11()
    } else {
        generated12()
    }
}

function generated12() {
    d12 = getRandomInt(24)
    if (d12 == d11 || d12 == d10 || d12 == d9 || d12 == d8 || d12 == d7 || d12 == d6 || d12 == d5 || d12 == d4 || d12 == d3 || d12 == d2 || d12 == d1 || d12 == 0) {
        generated12()
    } else {
        generated13()
    }
}

function generated13() {
    d13 = getRandomInt(24)
    if (d13 == d12 || d13 == d11 || d13 == d10 || d13 == d9 || d13 == d8 || d13 == d7 || d13 == d6 || d13 == d5 || d13 == d4 || d13 == d3 || d13 == d2 || d13 == d1 || d13 == 0) {
        generated13()
    } else {
        generated14()
    }
}

function generated14() {
    d14 = getRandomInt(24)
    if (d14 == d13 || d14 == d12 || d14 == d11 || d14 == d10 || d14 == d9 || d14 == d8 || d14 == d7 || d14 == d6 || d14 == d5 || d14 == d4 || d14 == d3 || d14 == d2 || d14 == d1 || d14 == 0) {
        generated14()
    } else {
        generated15()
    }
}

function generated15() {
    d15 = getRandomInt(24)
    if (d15 == d14 || d15 == d13 || d15 == d12 || d15 == d11 || d15 == d10 || d15 == d9 || d15 == d8 || d15 == d7 || d15 == d6 || d15 == d5 || d15 == d4 || d15 == d3 || d15 == d2 || d15 == d1 || d15 == 0) {
        generated15()
    } else {
        generated16()
    }
}

function generated16() {
    d16 = getRandomInt(24)
    if (d16 == d15 || d16 == d14 || d16 == d13 || d16 == d12 || d16 == d11 || d16 == d10 || d16 == d9 || d16 == d8 || d16 == d7 || d16 == d6 || d16 == d5 || d16 == d4 || d16 == d3 || d16 == d2 || d16 == d1 || d16 == 0) {
        generated16()
    } else {
        generated17()
    }
}

function generated17() {
    d17 = getRandomInt(24)
    if (d17 == d16 || d17 == d15 || d17 == d14 || d17 == d13 || d17 == d12 || d17 == d11 || d17 == d10 || d17 == d9 || d17 == d8 || d17 == d7 || d17 == d6 || d17 == d5 || d17 == d4 || d17 == d3 || d17 == d2 || d17 == d1 || d17 == 0) {
        generated17()
    } else {
        generated18()
    }
}

function generated18() {
    d18 = getRandomInt(24)
    if (d18 == d17 || d18 == d16 || d18 == d15 || d18 == d14 || d18 == d13 || d18 == d12 || d18 == d11 || d18 == d10 || d18 == d9 || d18 == d8 || d18 == d7 || d18 == d6 || d18 == d5 || d18 == d4 || d18 == d3 || d18 == d2 || d18 == d1 || d18 == 0) {
        generated18()
    } else {
        generated19()
    }
}

function generated19() {
    d19 = getRandomInt(24)
    if (d19 == d18 || d19 == d17 || d19 == d16 || d19 == d15 || d19 == d14 || d19 == d13 || d19 == d12 || d19 == d11 || d19 == d10 || d19 == d9 || d19 == d8 || d19 == d7 || d19 == d6 || d19 == d5 || d19 == d4 || d19 == d3 || d19 == d2 || d19 == d1 || d19 == 0) {
        generated19()
    } else {
        generated20()
    }
}

function generated20() {
    d20 = getRandomInt(24)
    if (d20 == d19 || d20 == d18 || d20 == d17 || d20 == d16 || d20 == d15 || d20 == d14 || d20 == d13 || d20 == d12 || d20 == d11 || d20 == d10 || d20 == d9 || d20 == d8 || d20 == d7 || d20 == d6 || d20 == d5 || d20 == d4 || d20 == d3 || d20 == d2 || d20 == d1 || d20 == 0) {
        generated20()
    } else {
        generated21()
    }
}

function generated21() {
    d21 = getRandomInt(24)
    if (d21 == d20 || d21 == d19 || d21 == d18 || d21 == d17 || d21 == d16 || d21 == d15 || d21 == d14 || d21 == d13 || d21 == d12 || d21 == d11 || d21 == d10 || d21 == d9 || d21 == d8 || d21 == d7 || d21 == d6 || d21 == d5 || d21 == d4 || d21 == d3 || d21 == d2 || d21 == d1 || d21 == 0) {
        generated21()
    } else {
        generated22()
    }
}

function generated22() {
    d22 = getRandomInt(24)
    if (d22 == d21 || d22 == d20 || d22 == d19 || d22 == d18 || d22 == d17 || d22 == d16 || d22 == d15 || d22 == d14 || d22 == d13 || d22 == d12 || d22 == d11 || d22 == d10 || d22 == d9 || d22 == d8 || d22 == d7 || d22 == d6 || d22 == d5 || d22 == d4 || d22 == d3 || d22 == d2 || d22 == d1 || d22 == 0) {
        generated22()
    } else {
        generated23()
    }
}

function generated23() {
    d23 = getRandomInt(24)
    if (d23 == d22 || d23 == d21 || d23 == d20 || d23 == d19 || d23 == d18 || d23 == d17 || d23 == d16 || d23 == d15 || d23 == d14 || d23 == d13 || d23 == d12 || d23 == d11 || d23 == d10) {
        generated23()
    }
    if (d23 == d9 || d23 == d8 || d23 == d7 || d23 == d6 || d23 == d5 || d23 == d4 || d23 == d3 || d23 == d2 || d23 == d1 || d23 == 0) {
        generated23()
    } else {
        generated24()
    }
}

function generated24() {
    d24 = getRandomInt(24)
    if (d24 == d23 || d24 == d22 || d24 == d21 || d24 == d20 || d24 == d19 || d24 == d18 || d24 == d17 || d24 == d16 || d24 == d15 || d24 == d14 || d24 == d13 || d24 == d12 || d24 == d11 || d24 == d10 || d24 == d9 || d24 == d8 || d24 == d7 || d24 == d6 || d24 == d5 || d24 == d4 || d24 == d3 || d24 == d2 || d24 == d1 || d24 == 0) {
        generated24()
    } else {
        printAll()
    }
}

function printAll() {
    console.log(d1)
    console.log(d2)
    console.log(d3)
    console.log(d4)
    console.log(d5)
    console.log(d6)
    console.log(d7)
    console.log(d8)
    console.log(d9)
    console.log(d10)
    console.log(d11)
    console.log(d12)
    console.log(d13)
    console.log(d14)
    console.log(d15)
    console.log(d16)
    console.log(d17)
    console.log(d18)
    console.log(d19)
    console.log(d20)
    console.log(d21)
    console.log(d22)
    console.log(d23)
    console.log(d24)
}
  • 7
    Not going to try to fix this code. Just create an array, fill it with numbers 1-24. Then shuffle the array. Done. [How to Fisher-Yates shuffle a JavaScript array?](https://stackoverflow.com/a/59837259) – 001 Jun 04 '23 at 21:34
  • 1
    This is probably better than the first link I added: [How to randomize (shuffle) a JavaScript array?](https://stackoverflow.com/q/2450954) – 001 Jun 04 '23 at 21:41
  • The other comments are right about a shuffle being much, much cleaner code, and the answer from Alexander gives a reasonable alternative. But the reason that your code always blows the recursion stack is that when you hit 24, you are cutting out every possibility. You compare it to the 23 existing values and 0; it will always be one of those and will try again. And again, and again, until it runs out of recursion space. You could add `+ 1` at the end of `getRandomInt`, which should (mostly) fix the issue. But really this code is not salvageable. – Scott Sauyet Jun 06 '23 at 13:56

1 Answers1

1

The code is crazy and no wonders it goes into infinite recursion. There's no sense in fixing/refactoring the code. The solution could be much simpler:

const length = 24;
const arr = Array
  .from({length}, (_, idx) => ({idx, sort: Math.random()})) // generate numbers and random order
  .sort((a, b) => a.sort - b.sort) // shuffle the array
  .map(({idx}) => idx + 1); // return shuffled numbers from 1 to <length>
  
console.log(arr);
Alexander Nenashev
  • 8,775
  • 2
  • 6
  • 17