Diminuisce la probabilità di scegliere l'elemento di una lista in base al suo indice

0

Ho una lista di suoni che devono essere riprodotti quando l'utente preme un pulsante.
Per ora ho appena generato un numero casuale all'interno del range della lista e seleziono il suono con quell'indice. (Evito anche che il suono venga riprodotto la prossima volta che si fa clic sul pulsante. Poiché è facile, vorrei concentrare solo nell'algoritmo di selezione e lasciare l'esclusione dietro.

Dal momento che è possibile riprodurre ripetutamente alcuni suoni in un pattern, mi piacerebbe regolare il mio algoritmo:

Una volta che un file è stato riprodotto, viene spostato alla fine dell'elenco. I suoni dall'inizio hanno una maggiore possibilità di essere riprodotti rispetto a quelli alla fine, quindi riducono al minimo la ripetizione.
Invece di assegnando un peso a ciascun indice , voglio avere un fattore che determini la probabilità di diminuzione. Ad esempio, impostare questo fattore su 1.2, il che significa che ogni indice è 1.2 volte più probabile che possa essere riprodotto come il seguente. Questo si spera produca un bel decadimento di probabilità.

La soluzione più veloce sembra essere una funzione matematica che associa il numero casuale all'intervallo di indici. In questo modo non devo impostare gli intervalli, ma posso calcolare direttamente il risultato in base al numero casuale.

Non riesco proprio a capire la matematica e l'implementazione di questa idea, quindi ho bisogno che tu la stenda per me. L'algoritmo verrà utilizzato in un'app Android, quindi il linguaggio di programmazione che sto utilizzando è Java.

    
posta J0hj0h 11.07.2014 - 17:52
fonte

1 risposta

1

Ci sono molti modi per implementare la ponderazione, ma dovresti iniziare pensando a questa come una funzione di ponderazione. In pseudo-codice:

function weight(int max) returns integer;

Il numero intero è un indice nell'intervallo di 0..max-1 che selezionerà un suono.

Hai a disposizione un generatore di numeri casuali che restituisce una distribuzione uniforme [0..1).

function random() returns real;

Ora hai bisogno di una formula per tradurre una distribuzione in un'altra.

// linear
return integer(random() * max);

Per implementare il "fattore" che proponi è necessario un po 'di matematica, che forse qualcun altro può aiutare. Potrebbe andare qualcosa di simile.

return integer(max*(1-x^1.2))

Suggerisco l'uso di uno strumento grafico per visualizzare le distribuzioni: link .

    
risposta data 12.07.2014 - 08:44
fonte

Leggi altre domande sui tag