// ¿Cuál es el número mínimo de veces que tienes que lanzar una moneda antes de que puedas tener tres lanzamientos consecutivos que den el mismo resultado (los tres son cara o los tres son cruz)? ¿Cuál es el número máximo de vueltas que se pueden necesitar? ¿Cuántas volteretas se necesitan en promedio? En este ejercicio exploraremos estas preguntas creando un programa que simule varias series de lanzamientos de monedas.
// Cree un programa que use un generador de números aleatorios para simular lanzar una moneda varias veces. La moneda simulada debe ser justa, lo que significa que la probabilidad de cara es igual a la probabilidad de cruz. Su programa debe lanzar monedas simuladas hasta que ocurran 3 caras consecutivas o 3 cruces consecutivos. Muestre una H cada vez que el resultado sea cara y una T cada vez que el resultado sea cruz, con todos los resultados de una simulación en la misma línea. Luego muestra el número de lanzamientos que se necesitaron para alcanzar 3 ocurrencias consecutivas del mismo resultado. Cuando se ejecuta su programa, debe realizar la simulación 10 veces e informar el número promedio de vueltas necesarias. La salida de muestra se muestra a continuación:
const headsOrTails = []; const flipcounts = []; let threeInARow = false; while (threeInARow == false) { const coinFlip = Math.floor(Math.random() * 10 + 1); if (coinFlip <= 5) { headsOrTails.push('H'); } else { headsOrTails.push('T'); } for (let index = 0; index < headsOrTails.length; index++) { const element = headsOrTails[index]; if (element == headsOrTails[index + 1]) { if (element == headsOrTails[index + 2]) { threeInARow = true; console.log('il numero di flip ottenuti è ' + headsOrTails.length); } } } }¿Hay alguna forma de repetir el bucle while varias veces? por ejemplo 10 veces
flips = []; for (let i = 0; i < 10; i++) { let threeInARow = false; let results = ""; while (threeInARow == false) { const coinFlip = Math.random(); results += coinFlip < 0.5 ? "H" : "T"; if (results.includes("HHH") || results.includes("TTT")) { threeInARow = true; console.log(results); flips.push(results.length); } } } console.log(flips); const average = arr => arr.reduce((a, b) => a + b, 0) / arr.length; console.log("Average:", average(flips))while...loop con un for...loopbreak para salir del ciclo antes si su variable booleana está configurada como verdadera.Vea abajo:
const headsOrTails = []; const flipcounts = []; let threeInARow = false; for(let i=0; i<10; i++) { const coinFlip = Math.floor(Math.random() * 10 + 1); if (coinFlip <= 5) { headsOrTails.push('H'); } else { headsOrTails.push('T'); } for (let index = 0; index < headsOrTails.length; index++) { const element = headsOrTails[index]; if (element == headsOrTails[index + 1]) { if (element == headsOrTails[index + 2]) { console.log('the number of flips obtained is ' + headsOrTails.length); threeInARow = true; } } } if(threeInARow) break; } if(!threeInARow) { console.log("No matches were found"); }Puede realizar un seguimiento de cuántas caras o cruces consecutivas ha habido en los n anteriores utilizando un par de variables y una ventana deslizante:
const flipCoin = () => Math.random() < 0.5 ? "H" : "T"; const flipCoinUntilNConsecutive = n => { const flips = [], slidingWindow = []; let windowHeadsCount = 0, windowTailsCount = 0; while (true) { const newestFlip = flipCoin(); flips.push(newestFlip); slidingWindow.push(newestFlip); newestFlip == "H" ? windowHeadsCount++ : windowTailsCount++; if (slidingWindow.length == n) { // array.length is O(1). if (windowHeadsCount == n || windowTailsCount == n) { console.log(...flips); return flips.length; } const oldestFlip = slidingWindow.shift(); oldestFlip == "H" ? windowHeadsCount-- : windowTailsCount--; } } }; const n = 3, repeats = 10; console.log(`${repeats} simulations of flipping a coin until ${n} consecutive:`); console.log(); let minFlipsRequired = Number.MAX_VALUE, maxFlipsRequired = 0, totalFlipsRequired = 0; for (let s = 1; s <= repeats; s++) { const flipsRequired = flipCoinUntilNConsecutive(n); console.log(`Simulation ${s}: ${flipsRequired}`); minFlipsRequired = Math.min(minFlipsRequired, flipsRequired); maxFlipsRequired = Math.max(maxFlipsRequired, flipsRequired); totalFlipsRequired += flipsRequired; } console.log(); console.log(`minFlipsRequired: ${minFlipsRequired}`); console.log(`maxFlipsRequired: ${maxFlipsRequired}`); console.log(`totalFlipsRequired: ${totalFlipsRequired}`); const averageFlipsRequired = totalFlipsRequired / repeats; console.log(`averageFlipsRequired: ${averageFlipsRequired}`);Salida de ejemplo:
10 simulations of flipping a coin until 3 consecutive: HTHTTT Simulation 1: 6 TTHHH Simulation 2: 5 HHH Simulation 3: 3 HHH Simulation 4: 3 HTHHH Simulation 5: 5 THHTTHHH Simulation 6: 8 HTHTHHH Simulation 7: 7 HTTT Simulation 8: 4 THTTT Simulation 9: 5 HHH Simulation 10: 3 minFlipsRequired: 3 maxFlipsRequired: 8 totalFlipsRequired: 49 averageFlipsRequired: 4.9