|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2008-06-18 16:05 UTC] payton2558 at googlemail dot com
Description:
------------
The reproduce code demonstrates the bug. You can modify the code in different ways to affect the severity of the output.
Appears to require Windows.
Please note I have tested on 2 different machines and 3 versions of php. I have also confirmed this with a couple of users on IRC.
mt_rand may also be affected but not as badly
Unrelated: bugs.php your CAPTCHA system is the worst I could ever expect for a programming related group
Reproduce code:
---------------
<?php
function RandomNumber() {
$word1 = file('word1.txt'); // word1 and word2.txt can be made by fwriting "word\n" 50000 times. Different filesizes affect bug.
$word2 = file('word2.txt');
$rword1 = trim($word1[array_rand($word1)]);
$rword2 = trim($word2[array_rand($word2)]);
$rnum = rand(1,999);
return $rnum;
}
for ($i=0; $i<20; $i++) {
echo RandomNumber()."\n";
}
?>
Expected result:
----------------
20 random looking numbers
Actual result:
--------------
20 identical numbers or in other cases, severely unrandom numbers
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Sat Oct 25 03:00:01 2025 UTC |
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"; } ?>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.