听起来你想要的是一个线性同余随机数生成器。它们实际上比编程和使用要复杂得多(甚至写出它的名字!)。它们真的很容易使用。
http://en.wikipedia.org/wiki/Linear_congruential_generator
使用这些,您可以只将当前的seed 值(即您选择首先设置的像素,或者您之前设置的像素)传递到表达式中:
seed = ((seed * multiplier) + increment) % modulus.
如下选择值:
seed = 您的初始值必须大于 0 且小于模数。
modulus = 图像中的像素总数(即width * height),在 PHP 中必须为 2^31 或更少。它可以多一点,尽管您的代码效率会降低:比像素数大 2 的下一个幂可能是一个不错的选择。
increment = 最简单:“1”。或者,最多为 23,622,320,123 的素数。或者如果不是这样,那么至少与模数互质,并且小于 (2^53-(modulus*multiplier))。
multiplier:
- 比能被模的所有素因数整除的数多一个。
- 如果模数是 4 的倍数,则大于 4 的倍数。
- 小于 2^22。
- 如果您选择的模数是 2 的幂,那么这个乘数可以是 (小素数 * 4) + 1。所以,5 或 9,或其他什么。
这种仔细选择值意味着,当您重复种子生成代码modulus 次时,您将永远不会得到重复的数字 - 您只会半随机地“选择”每个像素一次。
如果您的 modulus 大于 width * height,您有时会选择一个不在图像“内”的像素:如果您的图像是 10x10 或 100 像素,并且您选择了 128 的 modulus(下一个2) 的最大幂,那么你就有机会选择 100 到 127 之间的数字。在这种情况下,你可以再次循环它直到你得到一个有效的像素,或者只是改变更少的像素。
但如果它选择了一个从 0 到 99 的像素,那就是要使用的像素。因此,对于 10x10 的图像,种子 37 可能意味着第四行第八像素。
具体来说:
$pixelX = $seed / $width;
$pixelY = $seed % $width;