听起来你想要的是一个线性同余随机数生成器。实际上,它们的描述(甚至写出它的名字!)比编程和使用要复杂得多。它们真的很容易使用。
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-(模数*乘数))。
multiplier
:
- 比能被模的所有素因数整除的数多一。
- 如果模数是 4 的倍数,则大于 4 的倍数。
- 小于 2^22。
- 如果你选择的模数是 2 的幂,那么这个乘数可以是(小素数 * 4)+ 1。所以,5,或 9,或其他东西。
这种仔细选择值将意味着当您重复种子生成代码时modulus
,您将永远不会得到重复的数字 - 您将半随机地“选择”每个像素一次。
如果您modulus
大于width * height
,您有时会选择一个不在图像“中”的像素:如果您的图像是 10x10 或 100 像素,并且您选择了modulus
128(2 的下一个最大幂),那么您将有一个它有可能选择 100 到 127 之间的数字。在这种情况下,您可以再次循环它,直到获得有效像素,或者只更改更少的像素。
但如果它从 0 到 99 选择一个像素,那就是要使用的像素。因此,对于 10x10 的图像,种子 37 可能意味着第四行第八像素。
具体来说:
$pixelX = $seed / $width;
$pixelY = $seed % $width;