I wrote a simple function to randomize the order of an array. In pseudo-code, it looks like this :
def _array_rand (a) : for i = 0 to len (a) j = rand (len (a)) temp = a[i] a[i] = a[j] a[j] = temp return(a) Can anyone tell me if I'm missing the obvious here? Is the algorithm at fault? I'm getting a definite bias in the results when the function is written in PHP (4.2.0 Win) with both rand() and mt_rand(). The same function written in Python doesn't seem to exhibit the bias. Sample output: Python PHP 1 1806461 1651056 2 1809213 1717800 3 1804307 1777075 4 1807041 1814477 5 1803453 1845398 6 1808826 1868065 7 1812426 1877706 8 1808599 1869301 9 1811242 1846000 10 1808432 1813122 You can see this curve effect in the script below, which includes a simple test-harness. <? function _array_rand($a) { $num = sizeof($a); for ($i = 0; $i < $num; $i++) { $j = mt_rand (0, $num-1); //$j = rand (0, $num-1); $temp = $a[$i]; $a[$i] = $a[$j]; $a[$j] = $temp; } return ($a); } $a = array(1,5,10,15,20,25,30,35,40,45); $r = array(0,0,0,0,0,0,0,0,0,0); $iterations = 80000; for ($i = 0; $i < $iterations; $i++) { $b = _array_rand($a); for ($j = 0; $j < sizeof($r); $j++) { $r[$j] = $r[$j] + $b[$j]; } } echo('<table border="0">'); for ($i = 0; $i < sizeof($r); $i++) { echo("<tr><td>" . ($i+1) . "</td><td>" . $r[$i] . "</td>\n"); $x = ($r[$i]/($iterations/20))-100; echo('<td><img src="http://psc.apl.washington.edu/northpole/pngs/Bluebar_r8_c1.gif" height="10" width="'.$x.'"></td></tr>'); } echo('</table>'); ?> -- PHP General Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php