2012-12-15 18 views
5

Non riesco a capirlo.Chiama la funzione casuale sulle percentuali?

Ho bisogno di una soluzione per chiamare una funzione casuale per la sua percentuale.

Es. c'è il 10% di probabilità che lo script chiami abbonamenti() e il 3% di possibilità che il sistema chiami la funzione "specialitems()".

Sono bloccato in questo, quindi spero che qualcuno possa aiutarmi con questo Brainkiller.

<?php 
    class RandomGifts { 
    public $chances = ''; 

    public function __construct($user) { 
      $this->user = $user; 

      //Find percent for each function 
      $this->chances = array( 
       'subscriptions' => 10, // 10% 
       'specialitems' => 3, // 5% 
       'normalitems' => 30, // 40% 
       'fuser'   => 50, // 70% 
       'giftcards'  => 7, // 7% 
     ); 

//This should call the function which has been calculated. 
self::callFunction(?); 

} 

    public function subscriptions(){} 
    public function specialitems(){} 
    public function normalitems(){} 
    public function fuser(){} 
    public function giftcards(){} 

} 
?> 
+1

Le percentuali nei commenti non corrispondono ai valori effettivi. Perché i commenti ci sono per niente? – GolezTrol

+1

aggiungi la domanda per i compiti a casa in modo che possa aiutarci a capire meglio cosa stai cercando di fare. –

+0

Penso che la mia risposta risolva il tuo problema –

risposta

4

Prova questo:

$a = rand(1, 100); 
$total = 0; 
$f = ''; 
foreach($this->chances as $function => $percent) { 
    $total += $percent; 
    if($a <= $total) { 
     $f = $function; 
     break; 
    } 
} 
if(!empty($f)) 
    $this->$f(); 

Le percentuali non dovrebbe aggiungere a qualsiasi cosa sopra 100. Se la somma è inferiore a 100, quindi la restante percentuale è "non fare nulla".

+0

Mi piace questa soluzione perché è semplice, ma non sarebbe completamente "casuale", poiché dipenderebbe dall'ordinamento delle possibilità? – kennypu

+1

@kennypu No, poiché '$ a' è casuale. – irrelephant

-1

Quindi chiamare una funzione con la classe e il nome $ var basta.

$this->$var();