Login   Register  
PHP Classes
elePHPant
Icontem

File: class.random.php

Recommend this page to a friend!
Stumble It! Stumble It! Bookmark in del.icio.us Bookmark in del.icio.us
  Classes of Chao Xu  >  Random Lib  >  class.random.php  >  Download  
File: class.random.php
Role: Class source
Content type: text/plain
Description: The randomlib class
Class: Random Lib
Pick a random items with probability weights
Author: By
Last change: Update to version 1.4
Date: 5 years ago
Size: 7,203 bytes
 

Contents

Class file image Download
<?php
/*********************************
RandomLib Version 1.4
Programmed by : Chao Xu(Mgccl)
E-mail        : mgcclx@gmail.com
Website       : http://mgccl.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.
Change        :
1.4
Small bug fix in bcrand() and speed improvement
1.3
Add the rand() method, it choses which random method to be used
on generate random numbers.
1.2
Add truerand(), get a random number from http://www.random.org
1.1
Add some BC functions and the power of generate
very large random numbers
ToDo         :Speed improvements for large inputs
*********************************/
    
class random{
var 
$data = array();
var 
$rand_op 'rand';

function 
rand($min 0$max 1$amount 1){
    if(
$this->rand_op=='rand'){
        if(
$amount == 1){
            return 
rand($min$max);
        }else{
            
$i 0;
            while(
$i$amount){
                
$rand[] =rand($min$max);
                ++
$i;
            }
            return 
$rand;
        }
    }elseif(
$this->rand_op=='mt_rand'){
        if(
$amount == 1){
            return 
mt_rand($min$max);
        }else{
            
$i 0;
            while(
$i$amount){
                
$rand[] =mt_rand($min$max);
                ++
$i;
            }
            return 
$rand;
        }
    }elseif(
$this->rand_op=='truerand'){
        return 
$this->truerand($min$max$amount);
    }
}
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 $this->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[] = $this->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 
bc_select_weighted($amount=1){
    
$count count($this->data);
    
$i 0;
    
$max = -1;
    while(
$i $count){
        
$max bcadd($this->data[$i]['w'],$max);
        ++
$i;
    }
    if(
== $amount){
        
$rand $this->bcrand(0$max);
        
$w 0$n 0;
        while(
bccomp($w,$rand) == 0||bccomp($w,$rand)== -1){
            
$w bcadd($this->data[$n]['w'],$w);
            ++
$n;
        }
        
$key $this->data[$n-1]['s'];
    }else{
        
$i 0;
        while(
$i<$amount){
            
$random[] = $this->bcrand(0$max);
            ++
$i;
        }
        
natsort($random);
        
$i 0;
        
$n 0;
        
$w 0;
        while(
$i<$amount){
            while(
bccomp($w,$random[$i]) == 0||bccomp($w,$random[$i])== -1){
                
$w bcadd($this->data[$n]['w'],$w);
                ++
$n;
            }
            
$key[] = $this->data[$n-1]['s'];
            ++
$i;
        }
    }
    return 
$key;
}



function 
select_weighted_unique($amount=1){
    if(
$amount == 1){
        return 
$this->select_weighted(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 $this->rand(0,$max);
            while(
$w <= $num){
                
$w += $this->data[$n]['w'];
                ++
$n;
            }
            
$sub $this->data[$n-1]['w'];
            
$key[] = $this->data[$n-1]['s'];
            
            
array_splice($this->data$n-11);
            ++
$i;
        }
        return 
$key;
    }
}

function 
bc_select_weighted_unique($amount=1){
    if(
$amount == 1){
        return 
$this->bc_select_weighted(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 bcadd($this->data[$i]['w'],$max);
            ++
$i;
        }
        
        
$i 0;
        while(
$i $amount){
            
$max bcsub($max,$sub);
            
$w 0;
            
$n 0;
            
$num $this->bcrand(0,$max);
            
//BCCOMP!!!!!!
            
while(bccomp($w,$num) == || bccomp($w,$num) == -1){
                
$w bcadd($this->data[$n]['w'],$w);
                ++
$n;
            }
            
$sub $this->data[$n-1]['w'];
            
$key[] = $this->data[$n-1]['s'];
            
            
array_splice($this->data$n-11);
            ++
$i;
        }
        return 
$key;
    }
}

function 
bcrand($min$max) {
    
bcscale(0);
    if(
bccomp($max,$min)!=1) return 0;
    
$t bcsub($max,$min);
    
$l strlen($t);
    for(
$n=0,$r='';$n<$l;$n+=9){
        
$e = (string) $this->rand(0,999999999);
        
$r .= str_pad($e 9'0'STR_PAD_LEFT);
    }
    
$r substr($r,0,$l);
    while(
bccomp($r,$t)==1$r substr($r,1,$l).$this->rand(0,9);
    return 
bcadd($r,$min);
}

function 
truerand($min$max$amount=1){
    if(
$amount == 1){
        
$fp fopen("http://www.random.org/cgi-bin/randnum?num=".$amount."&min="."$min"."&max="."$max"."&col=1""r");
        
$num fread($fp4096*$amount);
        
fclose($fp);
        return 
$num;
    }else{
        if(
$amount 10000){
            return 
false;
        }
        
$fp fopen("http://www.random.org/cgi-bin/randnum?num=".$amount."&min="."$min"."&max="."$max"."&col=1""r");
        
$num fread($fp4096*$amount);
        
fclose($fp);
        
$num explode("\n"$num);
        unset(
$num[count($num)-1]);
        return 
$num;
    }
}

}
?>