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(1 == $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;
}
}
}
?>
<?php
$timeparts = explode(' ',microtime());
$starttime = $timeparts[1].substr($timeparts[0],1);
include ('class.random.php');
$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);
?>
