Tengo una matriz de matrices y necesito elegir 2 combinaciones aleatorias y diferentes de (index1, index2)
Déjame dar un ejemplo
data = [["a", "b", "c", "d"], ["e", "g"], ["i", "j", "k"]]Necesito tener (index1: 0 , index2: 2) y (index1: 2 , index2: 1)
¿Cómo puedo lograr eso de manera eficiente?
Primero puedes crear una combinación:
const i11 = Math.floor(Math.random() * data.length); const i12 = Math.floor(Math.random() * data[i11].length);Luego puede verificar si la matriz interna tiene solo un elemento. Si tiene un solo elemento y es la primera combinación, debes ignorarlo en los siguientes pasos:
const dataLength = data[i11].length > 1 ? data.length : data.length - 1;Ahora puede generar el índice externo para la segunda combinación y ajustarlo:
let i21 = Math.floor(Math.random() * dataLength); if (i21 >= i11 && data[i11].length === 1) ++i21;A continuación, puede verificar si el índice externo de la primera combinación y el índice externo de la segunda combinación son iguales y hacer el mismo ajuste para evitar duplicados:
const innerDataLength = i21 === i11 ? data[i21].length - 1 : data[i21].length;Finalmente puedes generar el segundo índice interno y ajustarlo.
let i22 = Math.floor(Math.random() * innerDataLength); if (i21 === i11 && i22 >= i12) ++i22;Todo el código como una función con una prueba:
const data = [["a", "b", "c", "d"], ["e", "g"], ["i", "j", "k"]]; function combinations(data) { const i11 = Math.floor(Math.random() * data.length); const i12 = Math.floor(Math.random() * data[i11].length); const dataLength = data[i11].length > 1 ? data.length : data.length - 1; let i21 = Math.floor(Math.random() * dataLength); if (i21 >= i11 && data[i11].length === 1) ++i21; const innerDataLength = i21 === i11 ? data[i21].length - 1 : data[i21].length; let i22 = Math.floor(Math.random() * innerDataLength); if (i21 === i11 && i22 >= i12) ++i22; return [[i11, i12], [i21, i22]]; } console.log(combinations(data)); for (let i = 0; i < 10000; ++i) { const [[i11, i12], [i21, i22]] = combinations(data); if (i11 === i21 && i12 == i22) console.log('Test failed!'); }