dovresti essere più specifico su alcuni aspetti

dici di estrarre un numero da 0 a n dove n è la lunghezza del tuo array, in questo caso intendi che hai un array incrementale di numeri (0, 1, 2, ..., n) o sono definiti all'interno in modo casuale (10, 6, 2, 3, ..., per n)?

con bassi e alti intendi il valore del numero, oppure la posizione all'interno dell'array?

la rarità di estrazione di un numero come è ponderata?
- tipo funzione potenza in, con un incremento di rarità iniziale leggero sino ad accelerare in modo molto marcato
- tipo funzione potenza out, il contrario di quanto detto sopra
- tipo standard con un incremento regolare

l'obbiettivo finale, oltre ad ottenere quanto richiesto dalla logica stessa, tende di più ad un livello di performance, qualità dell'output, semplicità di codice, ... .