【发布时间】:2012-01-13 02:55:26
【问题描述】:
我正在编写一个着色器,它偶尔会使一个点在 2D 地图上闪闪发光。 (“闪光”只是一个颜色更亮的像素。)我希望闪光块随机均匀地分布在(无限)平面上,但我希望闪光是基于 X 和 Y 坐标的确定性。我尝试从坐标创建种子并从该种子创建 Java Random,但到目前为止,我的尝试已经产生了可识别的模式。此函数将被频繁调用(数百万次),因此性能至关重要。
我首先尝试模仿我的hashCode() 实现,它使用质数乘数来避免冲突。这会导致地图上出现明显的裂痕,其中一系列点共享同一个种子。
然后我尝试通过像这样连接坐标来创建种子:
long seed = ((long) x << 32) | (long) y;
Random rand = new Random(seed);
这似乎也会产生模式化的数据,尽管模式并不那么明显。选定的坐标出现在直线上,根本不均匀分布。
我已经避免使用 MD5 或其他加密哈希算法,因为我担心会影响性能。
【问题讨论】:
-
如果您从 lcm 生成数百万个伪随机数并在二维正方形中绘制,那么您很可能会看到可识别的“模式”,除非您使用加密强生成器。搜索 k 平面。您可能想使用非线性同余伪随机数生成器。
标签: java hash coordinates seed deterministic