【发布时间】:2019-03-22 10:02:18
【问题描述】:
我正在寻找一个混合函数,它从区间
我想将此函数用作实时渲染器中的像素洗牌步骤,以选择渲染像素的顺序(输出将在固定时间后显示,如果尚未完成,这会给我带来噪音但快速部分预览)。间隔大小 n 将是渲染中的像素数(n = 1920*1080 = 2073600 将是一个典型值)。该函数必须是一对一的,这样我才能确保每个像素在完成时都只渲染一次。
我查看了 hash prospector 使用的可逆构建块,但这些主要针对 2 范围的幂。
我能想到的唯一其他方法是乘以大素数,但它并没有给出特别好的随机输出。
这里还有哪些其他选项?
【问题讨论】:
-
f(x) = (p*x+b) (mod n)其中p是gcd(p,n) = 1的大素数?b会让它看起来更随机。 -
我试过了,效果不大:/
-
如何使用具有 2 的幂的生成器,使用 2 的最小幂,即
> n?丢弃超过n的生成索引。平均而言,每 2 个输出中您将丢弃不到 1 个。如果生成器很快,那么这样使用它仍然会很快。 -
映射会保持一对一吗?
-
Yes:例如,给定一个排列
0, 4, 7, 1, 5, 3, 2, 6的0-7,如果你丢弃超过 5 的值,你会得到排列0, 4, 1, 5, 3, 2的0-5。将此视为过滤器。通过 0-7 的准随机方式产生通过 0-5 的准随机方式。这条路线有一些效率低下,但如果循环为 2 次方的生成器既快又分布良好,那么性能应该可以接受。
标签: math hash unsigned-integer