起源可能是论文:“On generate random numbers, with help of y= [(a+x)sin(bx)] mod 1”, WJJ Rey, 22nd European Meeting of Statisticians and the 7th Vilnius Conference on Probability Theory and数理统计,1998 年 8 月
编辑:由于我找不到本文的副本并且“TestU01”参考可能不清楚,这是伪 C 中 TestU01 中描述的方案:
#define A1 ???
#define A2 ???
#define B1 pi*(sqrt(5.0)-1)/2
#define B2 ???
uint32_t n; // position in the stream
double next() {
double t = fract(A1 * sin(B1*n));
double u = fract((A2+t) * sin(B2*t));
n++;
return u;
}
其中唯一推荐的常数值是 B1。
请注意,这是针对流的。转换为一维散列“n”成为整数网格。所以我的猜测是有人看到了这个并将't'转换为一个简单的函数f(x,y)。使用上面的原始常量将产生:
float hash(vec2 co){
float t = 12.9898*co.x + 78.233*co.y;
return fract((A2+t) * sin(t)); // any B2 is folded into 't' computation
}