Algoritmo que trae aleatoriamente los números más grandes más de una matriz

Aug 19 2020

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

2 NinaScholz Aug 19 2020 at 15:29

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; }