Algoritmo che porta in modo casuale i numeri più grandi più da un array

Aug 19 2020

Ho fatto ricerche e ho trovato l'algoritmo per piccoli elenchi in generale. Ho alcuni array come:

arr = [1,2,3,4 .... , 96,97,98,99,100];

arr2 = [105, 110, 165, 170];

arr3 = [1,2,7,8,9];

Voglio inviare questi array a una funzione e ottenere numeri casuali da questo array, ma voglio avere una maggiore probabilità di ottenere numeri più grandi ogni volta.

Ad esempio nell'array 1, la probabilità di 96 dovrebbe essere maggiore di 4, ma la probabilità di 97 dovrebbe essere maggiore di 96.

Come generare una distribuzione ponderata casuale di elementi

Di solito le soluzioni sono come in questo argomento. Tuttavia, ciò può causare problemi di prestazioni con i miei array.

Come posso ottenerlo?

Risposte

2 NinaScholz Aug 19 2020 at 15:29

Potresti calcolare le probabilità e scegliere il valore.

Per usarlo con un array personalizzato take random

getRandomValue = random(sortedArray),

e più tardi in un ciclo

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