|
php.net | support | documentation | report a bug | advanced search | search howto | statistics | random bug | login |
[2002-12-03 11:21 UTC] dave at arthistory dot cc
I use array_rand() to randomize an array that can have three different sizes, 450, 800 and 1152. With 450 array_rand works great. But when I try to select 800 and 1152 indexes with array_rand(), array_rand seems to seed higher number. I everycase I always get the 25 last indexes picked! Pretty weird! It seems to favor the last number!
I have tried:
srand ((float) microtime() * 10000000);
srand ((float) microtime() * 1000000);
But that didn't helped:
Here's my code:
if($bricks==1) $tempArrValue=450;
if($bricks==2) $tempArrValue=800;
if($bricks==3) $tempArrValue=1152;
$brickArray = array();
for($i=1;$i<=$tempArrValue;$i++){
$brickArray[$i]=$i;
}
srand ((float) microtime() * 10000000);
$brickArray2 = array_rand($brickArray, sizeof($brickArray)-3);
for($i=0;$i<sizeof($brickArray2);$i++){
mysql_query("insert into puzzle_bricks values(0,$countryIndex,$i, " . $brickArray2[$i] . ");");
}
My conclusion is that their are some problems when seeding random numbers for array_rand when you are selecting an array with more than 800 indexes as output.
I mean I have solved the issue by making my own array_rand function, but I just wanted to help makeing PHP a better product.
Best Regards Dave,
Ps, I love PHP, Ds
PatchesPull RequestsHistoryAllCommentsChangesGit/SVN commits
|
|||||||||||||||||||||||||||||||||||||
Copyright © 2001-2025 The PHP GroupAll rights reserved. |
Last updated: Sun Nov 02 15:00:01 2025 UTC |
Here's something to test properly: <?php function printline($string) { static $nl = -1; if($nl == -1) $nl = (isset($_SERVER['REMOTE_ADDR'])) ? "<br />\n" : "\n"; print("$string$nl"); } $bricks = (isset($argv[1])) ? $argv[1] : 1; if($bricks==1) $tempArrValue=450; if($bricks==2) $tempArrValue=800; if($bricks==3) $tempArrValue=1152; $brickArray = array(); for($i=1;$i<=$tempArrValue;$i++){ $brickArray[$i]=$i; } srand ((float) microtime() * 10000000); $brickArray2 = array_rand($brickArray, sizeof($brickArray)); for($i=0;$i<sizeof($brickArray2);$i++){ printline("$i => {$brickArray2[$i]}"); } ?> I can't reproduce it - in fact, the following quick-hack-shell-tester doesn't yield any output: #!/bin/ksh typeset -i COUNTER=1 while [ $COUNTER -lt 100 ]; do ./test_array_rand.php 3 | awk '{print $3}' | sort | perl -n -e 'print if $_ eq $previous; $previous=$_' COUNTER=`expr ${COUNTER} + 1` done You should probably look at the query, rather than at rand. But then again - if the above yields output, report back.I'm terrible sorry the cause is most certain mysqlbased, for some reason the first 100'rows contains almost 50% of number betweens 1000-1152 (from a random selection of 1-1152) weird. But the with the script: $tempArrValue=1000; $brickArray = array(); for($i=1;$i<=$tempArrValue;$i++){ $brickArray[$i]=$i; } srand ((float) microtime() * 10000000); $brickArray2 = array_rand($brickArray, sizeof($brickArray)); $temp = 0; for($i=0;$i<=250;$i++){ $temp = $temp + $brickArray2[$i]; } echo $temp / 250; I did get a correct answer, recieved number around 500. Again I'm terrible sorry for taking your time, please contact me of you want me to test something other, or anything else I can do. Best Regards Dave