Se per "migliore" in realtà intendi "il più veloce", allora il modo più veloce (anche se non quasi il più efficiente modo) è scegliere un moltiplicatore che rende tutti i pesi interi, almeno per quanto riguarda la precisione a cui tieni, quindi memorizza molte copie di ciascuna di esse in un unico grande array.
Ad esempio, se assegni a "moltiplicatore di punteggio" un peso dell'80% e "vita extra" un peso del 20%, quindi crea un array di 5 elementi con 4 riferimenti all'oggetto / variabile "moltiplicatore di punteggio" e 1 riferimento alla "vita extra". Quindi genera un numero casuale compreso tra 1 e 5 e scegli dall'indice corrispondente. La distribuzione non ha importanza.
In pratica, a meno che tu non abbia tonnellate di memoria e una CPU molto lenta, questo è uno spreco di memoria. È molto più semplice ed efficiente scrivere una serie di istruzioni if
confrontando un numero casuale con un limite basso / alto e se il numero di elementi possibili non è così grande (diciamo meno di 10?) Allora non dovrebbe essere così difficile da mantenere.
Se hai centinaia o migliaia di possibili articoli / power-up / qualunque cosa, allora questa non è più una soluzione molto manutenibile. In tal caso l'opzione migliore che conosco è quella di mantenere un elenco ordinato di tuple con il tasto come peso minimo; non è necessario memorizzare il massimo poiché ciò è implicito nell'elemento successivo. Ad esempio [ [0, scoreMultiplier], [80, extraLife], [95, invincibility] ]
. Quindi puoi eseguire una ricerca binaria su questo elenco per trovare l'elemento appropriato corrispondente a un numero casuale in tempo O (log N).