#native_company# #native_desc#
#native_cta#

mt_array_rand

By Will Fischer
on September 28, 2002

Version: 1.0

Type: Function

Category: Math Functions

License: GNU General Public License

Description: Handy drop-in function to replace PHP’s stock array_rand, but uses PHP’s mt_srand and mt_rand functions. The Mersenne Twister is much more random, and 4 times faster than standard rand() functions.

<?php
/* mt_array_rand - adapted from fake_array_rand func by [email protected] */
/* copyleft (c) 2002 Will Fischer <[email protected]> */

function mt_array_rand($array, $num_req = 1)
{
  /* Ensure that $num_req has a sane value */
  $num_req > 0 or $num_req = 1;

  $count = count ($array);

  for ($n=0; $n < $num_req; ++$n)
  {
    /* Seed the thing, for versions < 4.2.0 */
    mt_srand ((double) microtime() * 10000000);
    $randval = mt_rand();

    /* Use the random value to 'pick' an entry from the array */
    /* Count the number of times that the entry is picked */
    ++$index[$randval % $count];
  }

  /* Loop through the array */
  for ($n = 0; $n < $count; ++$n, next($array))
  {
    /* When we get to an entry that has been picked
       Put the entry into an array for output
       Don't forget to decrease the counter */
    while ($index[$n])
    {
      $out[] = key ($array);
      --$index[$n];
    }
  }

  /* Return a string if only on random key was asked for, otherwise return an array */
  return ($num_req == 1) ? $out[0] : $out ;
}

?>