2011-11-26 4 views

risposta

15

Aggiungere tutti i valori (10 + 2 + 12 è 24); ottenere un numero casuale nell'intervallo [0, 24) e selezionare l'elemento corrispondente a seconda che il numero si trovi in ​​[0, 10), [10, 12) o [12, 24).

+0

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 –

+1

Haha, abbastanza. Beh, la stessa cosa è matematica, ma il trucco è programmarlo nel modo più efficiente :-) –

+2

Se sceglierete molti valori casuali, allora l'algoritmo di Akshar è più efficiente. Akshar's è in O (1) mentre Kerrek è in O (log (n)). – Jyaif

0

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.

1

lo farei in questo modo:

$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)); 
    }