ID: 45301 Comment by: scott046 at hotmail dot com Reported By: payton2558 at googlemail dot com Status: Assigned Bug Type: Math related Operating System: win32 only PHP Version: * Assigned To: pajoye New Comment:
If anybody is interested, this code: <?php print("20 element array; apparently no problem<br>\r\n"); $array1 = array(); $counter1 = 0; while($counter1 < 20) { $array1[] = $counter1; $counter1++; } $print_counter1 = 0; while($print_counter1 < 10) { print($array1[array_rand($array1)] . "<br>\r\n"); $print_counter1++; } print("<br>\r\n<br>\r\n200 element array; apparently no problem<br>\r\n"); $array1 = array(); $counter1 = 0; while($counter1 < 200) { $array1[] = $counter1; $counter1++; } $print_counter1 = 0; while($print_counter1 < 10) { print($array1[array_rand($array1)] . "<br>\r\n"); $print_counter1++; } print("<br>\r\n<br>\r\n2000 element array; apparently no problem<br>\r\n"); $array1 = array(); $counter1 = 0; while($counter1 < 2000) { $array1[] = $counter1; $counter1++; } $print_counter1 = 0; while($print_counter1 < 10) { print($array1[array_rand($array1)] . "<br>\r\n"); $print_counter1++; } print("<br>\r\n<br>\r\n10000 element array; apparent problem: mild repetition<br>\r\n"); $array1 = array(); $counter1 = 0; while($counter1 < 10000) { $array1[] = $counter1; $counter1++; } $print_counter1 = 0; while($print_counter1 < 10) { print($array1[array_rand($array1)] . "<br>\r\n"); $print_counter1++; } print("<br>\r\n<br>\r\n20000 element array; apparent problem: repetition<br>\r\n"); $array1 = array(); $counter1 = 0; while($counter1 < 20000) { $array1[] = $counter1; $counter1++; } $print_counter1 = 0; while($print_counter1 < 10) { print($array1[array_rand($array1)] . "<br>\r\n"); $print_counter1++; } print("<br>\r\n<br>\r\n30000 element array; apparent problem: repetition<br>\r\n"); $array1 = array(); $counter1 = 0; while($counter1 < 30000) { $array1[] = $counter1; $counter1++; } $print_counter1 = 0; while($print_counter1 < 10) { print($array1[array_rand($array1)] . "<br>\r\n"); $print_counter1++; } print("<br>\r\n<br>\r\n50000 element array; apparent problem: repetition<br>\r\n"); $array1 = array(); $counter1 = 0; while($counter1 < 50000) { $array1[] = $counter1; $counter1++; } $print_counter1 = 0; while($print_counter1 < 10) { print($array1[array_rand($array1)] . "<br>\r\n"); $print_counter1++; } print("<br>\r\n<br>\r\n100000 element array; 32767=2^15-1 repeating; <br>\r\n"); $array1 = array(); $counter1 = 0; while($counter1 < 100000) { $array1[] = $counter1; $counter1++; } $print_counter1 = 0; while($print_counter1 < 10) { print($array1[array_rand($array1)] . "<br>\r\n"); $print_counter1++; } print("<br>\r\n<br>\r\n200000 element array; 32767=2^15-1 repeating; <br>\r\n"); $array1 = array(); $counter1 = 0; while($counter1 < 200000) { $array1[] = $counter1; $counter1++; } $print_counter1 = 0; while($print_counter1 < 10) { print($array1[array_rand($array1)] . "<br>\r\n"); $print_counter1++; } print("<br>\r\n<br>\r\n300000 element array; 32767=2^15-1 repeating; <br>\r\n"); $array1 = array(); $counter1 = 0; while($counter1 < 300000) { $array1[] = $counter1; $counter1++; } $print_counter1 = 0; while($print_counter1 < 10) { print($array1[array_rand($array1)] . "<br>\r\n"); $print_counter1++; } ?> produces this output: 20 element array; apparently no problem 16 5 11 9 17 7 15 2 8 9 200 element array; apparently no problem 43 25 147 127 127 2 109 14 67 165 2000 element array; apparently no problem 26 1513 1882 1721 590 917 1237 596 409 1170 10000 element array; apparent problem: mild repetition 2661 6633 8864 1157 2432 6681 6995 6633 8864 1157 20000 element array; apparent problem: repetition 2432 13677 15498 3590 13677 15498 3590 13677 15498 3590 30000 element array; apparent problem: repetition 13677 15498 3590 13677 15498 3590 13677 15498 3590 13677 50000 element array; apparent problem: repetition 19089 29176 3590 29176 3590 29176 3590 29176 3590 29176 100000 element array; 32767=2^15-1 repeating; 3590 32767 32767 32767 32767 32767 32767 32767 32767 32767 200000 element array; 32767=2^15-1 repeating; 32767 32767 32767 32767 32767 32767 32767 32767 32767 32767 300000 element array; 32767=2^15-1 repeating; 32767 32767 32767 32767 32767 32767 32767 32767 32767 32767 for me. I do not know the exact problem although the randomization seems progressively worse on larger arrays. Previous Comments: ------------------------------------------------------------------------ [2008-07-02 11:47:39] j...@php.net See also bug #45302 ------------------------------------------------------------------------ [2008-06-18 21:26:39] paj...@php.net > What about merging a patch that circulated in @internals that made > rand() and alias to mt_rand() and be done with this ? Because it may not fix the problem? (see the other report today and two weeks ago). ------------------------------------------------------------------------ [2008-06-18 21:04:23] crrodriguez at suse dot de What about merging a patch that circulated in @internals that made rand() and alias to mt_rand() and be done with this ? ------------------------------------------------------------------------ [2008-06-18 19:40:10] payton2558 at googlemail dot com Here's the shortest version. Try varying the array_fill num parameter. Lower numbers appear to increase the randomness. Appears problem is array_rand interfering with the random seed but please investigate further than that as I'm certain I experienced this problem before ever using array_rand (rand(0,count($a)-1) works in its place and doesn't trigger bug in this example). <?php $a = array_fill(0, 100000, "word"); for ($i=0; $i<20; $i++) { array_rand($a); echo rand(1,9999)."\n"; } ?> ------------------------------------------------------------------------ [2008-06-18 18:06:09] sv4php at fmethod dot com Confirmed on Apache 2.2, Windows XP SP2 with PHP 5.2.6. Confirmed also without building files (just building the array directly in a loop). Requires Windows, doesn't seem to affect mt_rand(); ------------------------------------------------------------------------ The remainder of the comments for this report are too long. To view the rest of the comments, please view the bug report online at http://bugs.php.net/45301 -- Edit this bug report at http://bugs.php.net/?id=45301&edit=1