FRIHOST FORUMS SEARCH FAQ TOS BLOGS COMPETITIONS
You are invited to Log in or Register a free Frihost Account!


My final version of weighted random alpha





Mgccl
Can everyone please test to see if there is any bug, thanks!


Code:
      /*
        Weighted Random Ver 1.3 by Mgccl(mgcclx@gmail.com)
        Update: Dec/4/06
        Allow user to input the amount of the array to be chosed
        Allow user to chose only unique items
        Update: Nov/29/06
        Faster speed
        allow non-weighted random, seprate the
        string storing array and the weight storing array
       
        Useage: input $array[$i] = 'string' format(where $i is a number)
        $array[$i]is the string you want to return
        $weight[$i]is the weight of the string
        if one of the $array[$i] does not have a
        $weight[$i] as a match, it automatically
        set $weight[$i] as 1
        To allow use weighted function, call the function like this
        rand_string_pro($array, $weight);
        chose the amount you want to pick
        rand_string_pro($array, $weight, 3);
        chose only the unique
        rand_string_pro($array, $weight, 3, 1);
        */
   
   
   
   function rand_string_pro($array, $weight = 0, $amount = 1, $unique = 0){
      $count = count($array);
      if($amount == 1){
         if($weight == 0){
               return $array[mt_rand(0, $count - 1)];
            
         }else{
             $weighted_sum = array_sum($weight) + ($count-count($weight));
              $i = 0; $n = 0;
              $num = mt_rand(0, $weighted_sum);
              while($i < $count){
                 if(empty($weight[$i])){
                    ++$n;
                 }else{
                      $n += $weight[$i];
                    }
                  if($n >= $num){
                     break;
                  }
                  ++$i;
              }
              return $array[$i];
         }
      }else{
         if($weight == 0){
               $rand = array_rand($array, $amount);
               foreach ($rand as $var){
                  $result[] = $array[$var];
               }
               return $result;
         }else{
            if($unique == 0){
               $max = array_sum($weight)+ $count - count($weight);
               $i = 0;
               while($i<$amount){
                  $random[] = mt_rand(0, $max);
                  ++$i;
                  
               }
               sort($random);
               $i = 0; $n = 0; $m = 0;
               $random_count = count($random);
               while(1){
                  while($m >= $random[$i]){
                     $key[] = $array[$n-1];
                     ++$i;
                     if($i == $random_count){
                        break 2;
                     }
                  }
                  if($weight[$n]){
                     $m += $weight[$n];
                  }else{
                     ++$m;
                  }
                  ++$n;
               }
            }else{
               $i = 0;
               if($amount >= $count){
                  return $array;
               }else{
                  $weighted_sum = array_sum($weight) + ($count-count($weight)) - 1;
                  $sub = 0;
                  while($i<$amount){
                      $weighted_sum -= $sub;
                       $n = 0; $m = 0;
                       $num = mt_rand(0, $weighted_sum);
                       while ($m <= $num){
                        if($weight[$n]){
                           $m += $weight[$n];
                           $sub = $weight[$n];
                           ++$n;
                        }else{
                           ++$m;
                           $sub = 1;
                           ++$n;
                        }
                     }
                     if($n != 0){
                        $n = $n - 1;
                     }
                     $key[] = $array[$n];
                     unset($weight[$n]);
                     array_merge($weight);
                     ++$i;
                  }
               }
            }
         return $key;
         }
      }
   }
Daniel15
You still didn't explain how it works, the code is quite confusing Razz I haven't tried your code yet, but I might later.

Have you seen my weighted random code I did?
Related topics
Okay, I'm done trying to use CSS for layout.
Oldschool Gaming Fanwork Site
Windows Vista Official Thread
Firefox 1.5 beta 1 released
Rank images contest
Viper Guestbook
Cpanel Acess... again!
Anyone else having a problem with the 1.5 beta from Mozilla?
OpenOffice.org 2.0 Final Launches!
difference between windows xp service pack and sp 2 rc 1
My Personal Web Site - especially on the Japan trip
PHP code showoff - Weighted Random
Contest for the fastest weighted Random script, all my $f
Windows8.1 provided by MicrosoftDreamSpark is final version?
Reply to topic    Frihost Forum Index -> Scripting -> Php and MySQL

FRIHOST HOME | FAQ | TOS | ABOUT US | CONTACT US | SITE MAP
© 2005-2011 Frihost, forums powered by phpBB.