enfoque
Un O (log (n)) (esto es arrancado directamente de un answer to a very similar question):
La técnica habitual es la de transformar la matriz en una serie de sumas acumuladas:
[10 60 5 25] --> [10 70 75 100]
de Recogida un número aleatorio en el rango de cero hasta el total acumulado (en el ejemplo: 0 <= x < 100
). A continuación, utilice bisection en la formación acumulativa para localizar el índice en la matriz original:
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
Por ejemplo, si la variable aleatoria x es 4, que divide en dos la formación acumulativa da un índice de posición de 0, que corresponde a 10 en la matriz original.
Y, si la variable aleatoria x es 72, bisectar la matriz acumulativa proporciona un índice de posición de 2 que corresponde a 5 en la matriz original.
esto es lo que hice. Un enfoque idiota podría haber sido crear una matriz con 'manzana' añadida 10 veces a ella, 'naranja' 2 veces y así sucesivamente y luego elegir un elemento al azar usando array_rand –
Jaja, claro. Bueno, lo mismo matemáticamente, pero el truco es programarlo de la manera más eficiente :-) –
Si va a elegir muchos valores aleatorios, entonces el algoritmo de Akshar es más eficiente. Akshar está en O (1) mientras que Kerrek está en O (log (n)). – Jyaif