Bom dia!
O método estático Math.random() retorna um número pseudoaleatório de ponto flutuante que é maior ou igual a 0 e menor que 1, com distribuição aproximadamente uniforme nesse intervalo - que você pode então dimensionar para o intervalo desejado. A implementação seleciona a semente inicial para o algoritmo de geração de números aleatórios; ele não pode ser escolhido ou redefinido pelo usuário.
Mais detalhes dentro aqui da propria alura:
https://www.alura.com.br/artigos/funcao-math-random-javascript-numeros-pseudoaleatorios?srsltid=AfmBOorpJO_pzMVAWTp_KXRauNyDIdi8pCLUKyd_7ur2EQscY4NGsHl7
O parseInt mantém para você somente o número inteiro, removendo os decimais.
A questão maior aqui é por conta do ponto flutuante. Como a sua múltiplicação é por 3:
parseInt(Math.random() * 3)
O valor resultante deve estar sempre próximo de 3. O ideal é a multiplicação por 10, 100 ou 1000.
A soma de 1 não irá interferir se dentro ou fora, o resultado será o mesmo.
Espero ter ajudado. Se sim, marque este tópico como resolvido, para que mais pessoas possam também ter acesso à este esclarecimento.
Bons estudos!