Estoy seleccionando al azar 20 bicicletas de una variedad más grande de bicicletas y luego estoy creando una nueva variedad con esas bicicletas seleccionadas. Me gustaría asegurarme de que al menos 2 de las bicicletas seleccionadas al azar en esa nueva matriz sean de color rojo. Más de 2 pueden ser rojos, pero como mínimo 2 deberían serlo. ¿Cómo se logra esto mientras se hace justo para todas las bicicletas seleccionadas al azar?
Algún código de ejemplo:
const bikes = [ { type: 'bmx', color: 'red' }, { type: 'mountain', color: 'blue' }, { type: 'bmx', color: 'yellow' }, { type: 'mountain', color: 'black' }, { type: 'bmx', color: 'red' }, { type: 'bmx', color: 'purple' } ...more bikes ] const getRandomBikes = () => { const randomBikes = [] //random select 20 bikes for(let i = 0; i < 20; i++) { randomBikes.push(bikes[Math.floor(Math.random() * bikes.length)]) } return randomBikes } getRandomBikes() Muy simple para devolver una matriz aleatoria. Pero ahora, ¿cómo me aseguraría de que la matriz aleatoria de bicicletas contenga al menos dos bicicletas con color: 'red' sin afectar la probabilidad de que se seleccionen todas las bicicletas? Presumiblemente, estaría ejecutando getRandomBikes() hasta que la matriz devuelta cumpliera con los requisitos, pero digamos que mi matriz de bikes tiene 10000 , eso puede llevar una eternidad antes de que se cumpla el requisito. ¿Cómo me aseguro de que al menos dos bicicletas rojas terminen en la matriz de bicicletas seleccionada al azar?
Mientras itera, puede contar la cantidad de bicicletas requeridas de un color específico restante y, si es igual a la cantidad de elementos que quedan por elegir, elija solo de las bicicletas con el color correcto.
const bikes = [ { type: 'bmx', color: 'red' }, { type: 'mountain', color: 'blue' }, { type: 'bmx', color: 'yellow' }, { type: 'mountain', color: 'black' }, { type: 'bmx', color: 'red' }, { type: 'bmx', color: 'purple' } ]; const getRandomBikes = (requiredRed, totalPicks) => { const chosenBikes = []; const reds = bikes.filter(({ color }) => color === 'red'); for(let i = 0; i < totalPicks; i++) { const redsSoFar = chosenBikes.reduce((a, b) => a + (b.color === 'red'), 0); const picksRemaining = totalPicks - i; const mustChooseRed = requiredRed - redsSoFar === picksRemaining; chosenBikes.push( mustChooseRed ? reds[Math.floor(Math.random() * reds.length)] : bikes[Math.floor(Math.random() * bikes.length)] ); } return chosenBikes; } console.log(getRandomBikes(2, 3));O con menos complejidad
const bikes = [ { type: 'bmx', color: 'red' }, { type: 'mountain', color: 'blue' }, { type: 'bmx', color: 'yellow' }, { type: 'mountain', color: 'black' }, { type: 'bmx', color: 'red' }, { type: 'bmx', color: 'purple' } ]; const getRandomBikes = (requiredRed, totalPicks) => { const chosenBikes = []; const reds = bikes.filter(({ color }) => color === 'red'); let redsSoFar = 0; for(let i = 0; i < totalPicks; i++) { const picksRemaining = totalPicks - i; const mustChooseRed = requiredRed - redsSoFar === picksRemaining; const chosenBike = mustChooseRed ? reds[Math.floor(Math.random() * reds.length)] : bikes[Math.floor(Math.random() * bikes.length)] if (chosenBike.color === 'red') redsSoFar++; chosenBikes.push(chosenBike); } return chosenBikes; } console.log(getRandomBikes(2, 3));