PX : code

RandomLib by Chao Xu
Download this code


<?php

/*********************************
RandomLib Version 1.0
Programmed by : Chao Xu(Mgccl)
E-mail        : mgcclx@gmail.com
Website       : http://www.webdevlogs.com
Info          : Please email me if there is any feature you want
or there is any bugs. I will fix them as soon as possible.
*********************************/
    
class random{
var 
$data = array();
function 
add($string,$weight=1){
    
$this->data[] = array('s' => $string'w' => $weight);
}
function 
optimize(){
    foreach(
$this->data as $var){
        if(
$new[$var['s']]){
            
$new[$var['s']] += $var['w'];
        }else{
            
$new[$var['s']] = $var['w'];
        }
    }
    unset(
$this->data);
    foreach(
$new as $key=>$var){
        
$this->data[] = array('s' => $key'w' => $var);
    }
}

function 
select($amount=1){
    if(
$amount == 1){
        
$rand array_rand($this->data);
        
$result $this->data[$rand]['s'];
    }else{
        
$i 0;
        while(
$i<$amount){
            
$result[] = $this->data[array_rand($this->data)]['s'];
            ++
$i;
        }
    }
    return 
$result;
}

function 
select_unique($amount=1){
    if(
$amount == 1){
        
$rand array_rand($this->data);
        
$result $this->data[$rand]['s'];
    }else{
        
$rand array_rand($this->data$amount);
        foreach(
$rand as $var){
            
$result[] = $this->data[$var]['s'];
        }
    }
    return 
$result;
}

function 
select_weighted($amount=1){
    
$count count($this->data);
    
$i 0;
    
$max = -1;
    while(
$i $count){
        
$max += $this->data[$i]['w'];
        ++
$i;
    }
    if(
== $amount){
        
$rand mt_rand(0$max);
        
$w 0$n 0;
        while(
$w <= $rand){
            
$w += $this->data[$n]['w'];
            ++
$n;
        }
        
$key $this->data[$n-1]['s'];
    }else{
        
$i 0;
        while(
$i<$amount){
            
$random[] = mt_rand(0$max);
            ++
$i;
        }
        
sort($random);
        
$i 0;
        
$n 0;
        
$w 0;
        while(
$i<$amount){
            while(
$w<=$random[$i]){
                
$w += $this->data[$n]['w'];
                ++
$n;
            }
            
$key[] = $this->data[$n-1]['s'];
            ++
$i;
        }
    }
    return 
$key;
}

function 
select_weighted_unique($amount=1){
    
$count count($this->data);
    
$i 0;
    if(
$amount >= $count){
        while(
$i $count){
            
$return[] = $this->data[$i]['s'];
            ++
$i;
        }
        return 
$return;
    }else{
        
$max = -1;
        while(
$i $count){
            
$max += $this->data[$i]['w'];
            ++
$i;
        }
        
        
$i 0;
        while(
$i $amount){
            
$max -= $sub;
            
$w 0;
            
$n 0;
            
$num mt_rand(0,$max);
            while(
$w <= $num){
                
$w += $this->data[$n]['w'];
                ++
$n;
            }
            
$sub $this->data[$n-1]['w'];
            
$key[] = $this->data[$n-1]['s'];
            
            unset(
$this->data[$n-1]);
            
$this->data array_merge($this->data);
            ++
$i;
        }
        return 
$key;
    }
}
}
?>

Here is an example useage<br />

<?php
  $timeparts 
explode(' ',microtime());
  
$starttime $timeparts[1].substr($timeparts[0],1);
    
$random = new random;
    
$random->add('this have weight 1000, '1000);
    
$random->add('this have weight 1, '1);
    
$random->add('this have weight 200, '200);
    
$random->add('this have weight 500, '500);
?>
The random items:<br />
one weights 1000, one weights 1, one weights 200, one weights 500<br />
Result for randomly select 1 item:<?=$random->select()?><br />
Result for randomly select 3 item:<? print_r($random->select(3))?><br />
Result for randomly select 3 unique item:<? print_r($random->select_unique(3))?><br />
Result for weighted randomly select 1 item:<?=$random->select_weighted()?><br />
Result for weighted randomly select 3 item:<? print_r($random->select_weighted(3))?><br />
Result for weighted randomly select 3 unique item:<? print_r($random->select_weighted_unique(3))?><br />
<?php
      $timeparts 
explode(' ',microtime());
  
$endtime $timeparts[1].substr($timeparts[0],1);
  echo 
'time spent',bcsub($endtime,$starttime,6);
?>

Comments or questions?
PX is running PHP 5.2.17
Thanks to Miranda Productions for hosting and bandwidth.
Use of any code from PX is at your own risk.