On Fri, 16 Aug 2002, Tim Converse wrote:

> --- Yasuo Ohgaki <[EMAIL PROTECTED]> wrote:
> If you don't believe me, take your algorithm and run it
> many times, tracking how often element i in the input moves
> to become element j in the output, and print the resulting
> counts out as an n-by-n table.  You'll see a bias towards
> elements moving one position back in the array.

Yasuo --

Look at the following code. The php_shuffle() function is the
algorithm currently in the CVS; yasuo_shuffle() is what you're
proposing.

The test() function is a simple script to call each *_shuffle()
function 100,000 times on a three-element array, record the
permutations, and print out a record of the results. You'll see that
php_shuffle() evenly divides the elements, while yours does not:

<?php
function php_shuffle(&$array) {
  $i = count($array);
  while (--$i) {
    $j = mt_rand(0, $i);
    if ($i != $j) {
      
      /* swap elements */
      $tmp = $array[$j];
      $array[$j] = $array[$i];
      $array[$i] = $tmp;
    }
  }
}

function yasuo_shuffle(&$array) {
  $s = count($array);
  for ($i=0; $i < $s; $i++) {
    $j = mt_rand(0, $s - 1);
    if ($i != $j) {      
      /* swap elements */
      $tmp = $array[$j];
      $array[$j] = $array[$i];
      $array[$i] = $tmp;
    }
  }
}


function test($function) {
  $a = array();
  $times = 100000;

  for ($i = 0; $i < $times; $i++) {
    $p = range(1,3);
    $function($p);
    $s = join('', $p);
    $a[$s]++;
}

  print "$function\n";
  
  ksort($a);
  foreach($a as $k => $v) {
    print "$k: $v: " . sprintf('%0.3f', $v / $times) . "%\n";
  }

}

test('php_shuffle');
test('yasuo_shuffle');
?>

This is what I get repeatedly:

php_shuffle
123: 16707: 0.167%
132: 16641: 0.166%
213: 16569: 0.166%
231: 16751: 0.168%
312: 16532: 0.165%
321: 16800: 0.168%

yasuo_shuffle
123: 14755: 0.148%
132: 18427: 0.184%
213: 18554: 0.186%
231: 18566: 0.186%
312: 14790: 0.148%
321: 14908: 0.149%

-adam

-- 
adam maccabee trachtenberg
[EMAIL PROTECTED]


-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to