I wanted to put random points on an image (stars in space for some little fun side project)
I have this simple script.
<?php $gd = imagecreatetruecolor(1000, 1000); $white = imagecolorallocate($gd, 255, 255, 255); for ($i = 0; $i < 100000; $i++) { $x = rand(1,1000); $y = rand(1,1000); imagesetpixel($gd, round($x),round($y), $white); } header('Content-Type: image/png'); imagepng($gd); ?>
Keep in mind this is just for testing, that is why I put 100000 in for
loop so it shows the pattern I noticed emerging. We have 1 million pixel to use, still random X and Y creates this pattern instead:
So it is far from random. I know rand is not real random, that is why it isn’t good for cryptography. But I find no information about how it works and what should I do to avoid patterns like this.
Advertisement
Answer
Linear congruential random number generators (which is what PHP rand
uses) will always display autocorrelation effects on an x-y plot.
You will have better results with mt_rand
. This is a Mersenne Twister generator.