Last active
August 7, 2025 14:43
-
-
Save GlauberF/234fb9a3acbeafbebaefd241907e05fb to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// --- PARÂMETROS DA SIMULAÇÃO --- | |
// 1. Definimos os valores padrão (default) | |
const VALORES_PADRAO = { | |
tarefas: 15, | |
vazaoMin: 3, | |
vazaoMax: 8, | |
simulacoes: 10000, | |
}; | |
// 2. Capturamos os argumentos da linha de comando | |
const args = process.argv.slice(2); // Pega apenas os argumentos do usuário | |
// Exibe ajuda se o usuário pedir | |
if (args[0] === '--help' || args[0] === '-h') { | |
console.log(` | |
Uso: node previsao_cli.js [tarefas] [vazao_min] [vazao_max] | |
Argumentos: | |
[tarefas] - (Opcional) O número de tarefas restantes. Padrão: ${VALORES_PADRAO.tarefas} | |
[vazao_min] - (Opcional) A menor quantidade de tarefas feitas em uma semana. Padrão: ${VALORES_PADRAO.vazaoMin} | |
[vazao_max] - (Opcional) A maior quantidade de tarefas feitas em uma semana. Padrão: ${VALORES_PADRAO.vazaoMax} | |
Exemplos: | |
- Usar valores padrão: | |
node previsao_cli.js | |
- Simular para 50 tarefas restantes: | |
node previsao_cli.js 50 | |
- Simular para 50 tarefas com vazão entre 5 e 12: | |
node previsao_cli.js 50 5 12 | |
`); | |
process.exit(0); // Encerra o script | |
} | |
// 3. Substituímos os padrões pelos argumentos informados, se existirem | |
const TAREFAS_RESTANTES = parseInt(args[0], 10) || VALORES_PADRAO.tarefas; | |
const VAZAO_MINIMA_SEMANAL = parseInt(args[1], 10) || VALORES_PADRAO.vazaoMin; | |
const VAZAO_MAXIMA_SEMANAL = parseInt(args[2], 10) || VALORES_PADRAO.vazaoMax; | |
const NUMERO_DE_SIMULACOES = VALORES_PADRAO.simulacoes; | |
// Validação simples para garantir que min <= max | |
if (VAZAO_MINIMA_SEMANAL > VAZAO_MAXIMA_SEMANAL) { | |
console.error("\x1b[31mErro: A vazão mínima não pode ser maior que a vazão máxima.\x1b[0m"); | |
process.exit(1); // Encerra com código de erro | |
} | |
// --- LÓGICA DA SIMULAÇÃO (Permanece a mesma) --- | |
function sortearVazao(min, max) { | |
return Math.floor(Math.random() * (max - min + 1)) + min; | |
} | |
function executarUmaSimulacao() { | |
let semanas = 0; | |
let tarefasConcluidas = 0; | |
while (tarefasConcluidas < TAREFAS_RESTANTES) { | |
semanas++; | |
tarefasConcluidas += sortearVazao(VAZAO_MINIMA_SEMANAL, VAZAO_MAXIMA_SEMANAL); | |
} | |
return semanas; | |
} | |
function analisarResultados(resultados) { | |
resultados.sort((a, b) => a - b); | |
const calcularPercentil = (percentil) => { | |
const index = Math.ceil(percentil / 100 * resultados.length) - 1; | |
return resultados[index]; | |
}; | |
const p50 = calcularPercentil(50); | |
const p70 = calcularPercentil(70); | |
const p85 = calcularPercentil(85); | |
const p95 = calcularPercentil(95); | |
console.log("--- Previsão de Entrega (Simulação de Monte Carlo) ---"); | |
console.log(`\nBaseado em ${NUMERO_DE_SIMULACOES.toLocaleString('pt-BR')} simulações para completar ${TAREFAS_RESTANTES} tarefas:`); | |
console.log(`Vazão semanal estimada entre ${VAZAO_MINIMA_SEMANAL} e ${VAZAO_MAXIMA_SEMANAL} tarefas.`); | |
console.log("\nResultados Probabilísticos:"); | |
console.log(`\x1b[33m%s\x1b[0m`, ` -> 50% de chance de terminar em ${p50} semanas ou menos. (Resultado mais provável)`); | |
console.log(`\x1b[32m%s\x1b[0m`, ` -> 70% de chance de terminar em ${p70} semanas ou menos.`); | |
console.log(`\x1b[32m%s\x1b[0m`, ` -> 85% de chance de terminar em ${p85} semanas ou menos. (Previsão com alta confiança)`); | |
console.log(`\x1b[32m%s\x1b[0m`, ` -> 95% de chance de terminar em ${p95} semanas ou menos. (Previsão com confiança muito alta)`); | |
} | |
// --- EXECUÇÃO PRINCIPAL --- | |
const todosOsResultados = []; | |
for (let i = 0; i < NUMERO_DE_SIMULACOES; i++) { | |
todosOsResultados.push(executarUmaSimulacao()); | |
} | |
analisarResultados(todosOsResultados); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Exemplo de saída(usando dados padrão e fictícios)
`
node previsao_cli.js
--- Previsão de Entrega (Simulação de Monte Carlo) ---
Baseado em 10.000 simulações para completar 15 tarefas:
Vazão semanal estimada entre 3 e 8 tarefas.
Resultados Probabilísticos:
-> 50% de chance de terminar em 3 semanas ou menos. (Resultado mais provável)
-> 70% de chance de terminar em 3 semanas ou menos.
-> 85% de chance de terminar em 4 semanas ou menos. (Previsão com alta confiança)
-> 95% de chance de terminar em 4 semanas ou menos. (Previsão com confiança muito alta)
`
Explicação:
A saída de cada uma das 10.000 simulações é um número inteiro de semanas. O projeto pode terminar em 2 semanas, 3 semanas, 4 semanas, etc. Ele não pode terminar em 3.5 semanas, pois a nossa unidade de medida é a "semana" (a cada semana sorteamos uma nova quantidade de tarefas feitas).
Quando a simulação termina, temos uma lista com 10.000 números inteiros, por exemplo:
[3, 2, 4, 3, 3, 4, 2, 5, 3, 3, 4, ...]
Para calcular os percentis, o script ordena essa lista do menor para o maior:
[2, 2, ..., 3, 3, 3, 3, 3, ..., 4, 4, 4, ..., 5, ...]
Agora, vamos analisar o que a sua saída significa olhando para essa lista ordenada de 10.000 resultados:
1 -
50% de chance de terminar em 3 semanas ou menos
Isso significa que o resultado na posição 5.000 da lista ordenada (a metade) é o número 3. Ou seja, pelo menos 5.000 das 10.000 simulações terminaram em 3 semanas ou menos.
2 -
70% de chance de terminar em 3 semanas ou menos
Isso significa que se você avançar na lista até a posição 7.000, o resultado que está lá ainda é 3. Isso revela algo crucial: o resultado "3 semanas" é muito comum! Um grande "bloco" de resultados na sua lista ordenada, indo da posição ~5.000 até a ~7.000 (e provavelmente antes e depois), é composto pelo número 3.
3 -
85% de chance de terminar em 4 semanas ou menos
Aqui está o "pulo"! Quando você avança para a posição 8.500 na lista, o número finalmente muda para 4. Isso indica que entre o percentil 70 e o 85, os cenários que levavam 3 semanas se esgotaram e agora estamos na faixa de cenários que levaram 4 semanas.
4 -
95% de chance de terminar em 4 semanas ou menos
Da mesma forma que antes, ao avançar da posição 8.500 para a 9.500, o valor ainda é 4. Isso mostra que o resultado "4 semanas" também é bastante comum, cobrindo essa fatia de 10% das simulações.
O que isso significa na prática?
Essa repetição de valores lhe dá um mapa claro dos riscos.
1 - Alta Probabilidade de 3 Semanas: Existe uma chance muito grande (até 70%) de o projeto terminar em 3 semanas. Esse é o seu cenário mais provável e otimista-realista.
2 - Um "Degrau" de Risco: A simulação está alertando que existe um "degrau" ou "salto" de risco. Se as coisas não saírem como na maioria dos cenários (que terminam em 3 semanas), o próximo resultado mais provável não é 3.1 ou 3.2, mas sim 4 semanas.
3 - Planejamento de Alta Confiança: Se você precisa comunicar um prazo com alta confiança (85% ou mais), você não pode prometer 3 semanas. A simulação mostra claramente que para atingir esse nível de certeza, você precisa se planejar para 4 semanas.