编程语言
首页 > 编程语言> > java – 如何确定性地从X / Y坐标生成伪随机模式?

java – 如何确定性地从X / Y坐标生成伪随机模式?

作者:互联网

我正在写一个着色器,它偶尔会在2D地图上产生一个亮点. (“闪光”只是一个颜色较亮的像素.)我希望闪闪发光的块随机均匀地分布在(无限)平面上,但我希望闪闪发光是基于X和Y坐标的确定性.我尝试从坐标创建种子并从该种子创建Java Random,但到目前为止,我的尝试导致了可识别的模式.此功能将被频繁调用(数百万次),因此性能至关重要.

我首先尝试模仿我的hashCode()实现,它使用素数乘数来避免冲突.这导致地图上出现明显的伤口,其中一系列点共享相同的种子.

然后,我尝试通过连接坐标来创建种子,如下所示:

long seed = ((long) x << 32) | (long) y;
Random rand = new Random(seed);

这似乎也导致了图案数据,尽管模式并不那么明显.选定的坐标以线条显示,根本不均匀分布.

我避免使用MD5或其他加密哈希算法,因为我害怕性能影响.

解决方法:

以下是以伪随机但确定的方式混合位的非常有效的函数:

public static final long xorShift64(long a) {
    a ^= (a << 21);
    a ^= (a >>> 35);
    a ^= (a << 4);
    return a;
}

因此,如果您想要x和y坐标的伪随机长结果,您可以执行以下操作:

    long mix = xorShift64(x) + Long.rotateLeft(xorShift64(y),32) + 0xCAFEBABE;
    long result = xorShift64(mix);

我之前在图形中成功使用过这种方法,给出了不错的效果!随机数的质量和java.util.Random一样好,但速度要快得多….

标签:java,hash,coordinates,seed,deterministic
来源: https://codeday.me/bug/20190521/1146794.html