Algoritmo que trae aleatoriamente los números más grandes más de una matriz
Investigué y encontré el algoritmo para listas pequeñas en general. Tengo algunas matrices como:
arr = [1,2,3,4 .... , 96,97,98,99,100];
arr2 = [105, 110, 165, 170];
arr3 = [1,2,7,8,9];
Quiero enviar estas matrices a una función y obtener números aleatorios de esta matriz, pero quiero tener una mayor probabilidad de obtener números más grandes cada vez.
Por ejemplo, en la matriz 1, la probabilidad de 96 debería ser más de 4, pero la probabilidad de 97 debería ser más de 96.
Cómo generar una distribución ponderada aleatoria de elementos
Por lo general, las soluciones son como en este tema. Sin embargo, esto puede causar problemas de rendimiento con mis matrices.
¿Cómo puedo lograrlo?
Respuestas
Podrías calcular las probabilidades y elegir el valor.
Para usarlo con una matriz personalizada, tome random
getRandomValue = random(sortedArray),
y luego en un bucle
let value = getRandomValue();
const
random = sortedValues => {
let length = sortedValues.length,
sum = length * (length + 1) / 2;
return () => {
let r = Math.random();
return sortedValues.find((_, i) => (r -= (i + 1) / sum) <= 0);
};
},
getRandomValue = random([6, 7, 8, 9, 10]),
counts = {};
for (let i = 0; i < 1e6; i++) {
let value = getRandomValue();
counts[value] = (counts[value] || 0) + 1;
}
console.log(counts);
.as-console-wrapper { max-height: 100% !important; top: 0; }