2011-11-26 10 views

Respuesta

15

Agregar todos los valores (10 + 2 + 12 es 24); obtenga un número aleatorio en el rango [0, 24), y elija el elemento correspondiente dependiendo de si el número se encuentra en [0, 10), [10, 12) o [12, 24].

+0

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 –

+1

Jaja, claro. Bueno, lo mismo matemáticamente, pero el truco es programarlo de la manera más eficiente :-) –

+2

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

0
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.

1

lo haría así:

$probabilities = array('apple'=>50, 'orange'=>20, 'banana'=>10); 

    function random_probability($probabilities) { 
     $rand = rand(0, array_sum($probabilities)); 
     do { 
     $sum = array_sum($probabilities); 
     if($rand <= $sum && $rand >= $sum - end($probabilities)) { 
      return key($probabilities); 
     } 
     } while(array_pop($probabilities)); 
    } 
Cuestiones relacionadas