Un O approccio (log (n)) (questo è strappato direttamente da una answer to a very similar question):
La tecnica usuale è di trasformare l'array in un array di somme cumulative:
[10 60 5 25] --> [10 70 75 100]
pescaggio un numero casuale compreso tra zero e totale cumulativo (nell'esempio: 0 <= x < 100
). Quindi, utilizzare bisection sulla matrice cumulativo per localizzare l'indice nella matrice originale:
Random variable x Index in the Cumulative Array Value in Original Array
----------------- ----------------------------- ----------------------
0 <= x < 10 0 10
10 <= x < 70 1 60
70 <= x < 75 2 5
75 <= x < 100 3 25
Ad esempio, se la variabile casuale x è 4, che biseca l'array cumulativo dà un indice di posizione 0 che corrisponde 10 nella matrice originale.
E, se la variabile casuale x è 72, bisecare l'array cumulativo fornisce un indice di posizione di 2 che corrisponde a 5 nell'array originale.
fonte
2013-11-28 20:59:52
questo è quello che ho fatto. Un approccio idiota avrebbe potuto essere creare un array con "apple" aggiunto 10 volte, "orange" 2 volte e così via e quindi scegliere un elemento a caso usando array_rand –
Haha, abbastanza. Beh, la stessa cosa è matematica, ma il trucco è programmarlo nel modo più efficiente :-) –
Se sceglierete molti valori casuali, allora l'algoritmo di Akshar è più efficiente. Akshar's è in O (1) mentre Kerrek è in O (log (n)). – Jyaif