Actualmente estoy tratando de crear un selector de índice ponderado aleatorio.
Mi objetivo es elegir aleatoriamente un elemento de una matriz. Sin embargo, no es tan simple como hacer esto. Ciertos elementos tienen una boosted probabilidad de ganar. Esto puede ser visto como una especie de lottery
La estructura de datos es la siguiente:
const users = [ {userId: 1, multiplier: 0}, {userId: 2, multiplier: 25} {userId: 3, multiplier: 0} {userId: 4, multiplier: 25} {userId: 5, multiplier: 15} {userId: 6, multiplier: 30} {userId: 7, multiplier: 35} {userId: 8, multiplier: 2} {userId: 8, multiplier: 7} ]Cada elemento de la matriz cuenta como una entrada. Sin embargo, los multiplicadores permiten que el usuario tenga mayores posibilidades de ganar.
Una solución que se me ocurrió fue ver los multipliers como una number of tickets , de modo que si un usuario tuviera un multiplicador de 25, tendría 25 boletos.
Sin embargo, esto es muy ineficiente porque cuando hay decenas de miles de entradas con muchos multiplicadores, el tamaño de la matriz crece a un ritmo increíble.
No estoy seguro de cómo puedo hacer esto más eficiente.
Mi solución se puede ver aquí:
const users = [ {userId: 1, multiplier: 0}, {userId: 2, multiplier: 25} {userId: 3, multiplier: 0} {userId: 4, multiplier: 25} {userId: 5, multiplier: 15} {userId: 6, multiplier: 30} {userId: 7, multiplier: 35} {userId: 8, multiplier: 2} {userId: 8, multiplier: 7} ] const potentialWinners = [] users.map((user) => { for(let i=0; i < user.multiplier; i++) { potentialWinners.push(user.userId) } })Otras soluciones que he visto parecían bastante complicadas y no soy bueno en matemáticas, por lo que me costó entender lo que estaba sucediendo.
También parecen funcionar en función de los porcentajes, y el mío no. No estoy del todo seguro de cómo puedo modificar el sistema multiplicador para tener en cuenta una probabilidad multiplicada de ganar.