gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 20:05:30 28 4
gpt4 key购买 nike

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

我首先尝试模仿我的 hashCode() 实现,它使用素数乘法器来避免冲突。这导致 map 上出现一条可见的裂缝,其中一系列点共享相同的种子。

然后我尝试通过像这样连接坐标来创建种子:

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 - 如何确定性地从 X/Y 坐标生成伪随机模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8845333/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com