我正在尝试在 JavaScript(glibc 中使用的那个)中创建一个自定义线性同余生成器(LCQ)。
它在维基百科上的属性是:m=2^31
, a=1103515245
, c=12345
.
现在我得到下一个种子价值
x = (1103515245 * x + 12345) % 0x80000000 ; // (The same as &0x7fffffff)
虽然生成器似乎可以工作,但是当在画布上测试数字时:
cx = (x & 0x3fffffff) % canvasWidth; // Coordinate x (the same for cy)
他们似乎有可怕的偏见:http: //jsfiddle.net/7VmR9/3/show/
为什么会这样?通过选择不同的模数,视觉测试的结果看起来要好得多。
测试 JSFiddle 在这里:http: //jsfiddle.net/7VmR9/3/
更新
最后,我将转换固定为画布坐标,如下公式所示:
var cx = ((x & 0x3fffffff)/0x3fffffff*canvasWidth)|0
现在像素坐标不像使用模运算时那样畸形。
更新小提琴:http: //jsfiddle.net/7VmR9/14/