JavaScript中的自定义线性同余生成器

JavaScript中的自定义线性同余生成器,javascript,canvas,random,functional-testing,lcg,Javascript,Canvas,Random,Functional Testing,Lcg,我正在尝试用JavaScript(glibc中使用的)创建一个自定义(LCQ) 其所述属性为:m=2^31,a=1103515245,c=12345 现在,我将获得下一个种子值 x=(1103515245*x+12345)%0x8000000;//(与&0x7fffffff相同) 虽然生成器似乎工作正常,但在画布上测试数字时: cx=(x&0x3fffffff)%canvasWidth;//坐标x(与cy相同) 他们似乎有着可怕的偏见: 为什么会发生这种情况?通过选择不同的模,视觉测试的结果

我正在尝试用JavaScript(glibc中使用的)创建一个自定义(LCQ)

其所述属性为:
m=2^31
a=1103515245
c=12345

现在,我将获得下一个种子值

x=(1103515245*x+12345)%0x8000000;//(与&0x7fffffff相同)
虽然生成器似乎工作正常,但在画布上测试数字时:

cx=(x&0x3fffffff)%canvasWidth;//坐标x(与cy相同)
他们似乎有着可怕的偏见:

为什么会发生这种情况?通过选择不同的模,视觉测试的结果看起来更好

测试JSFIDLE如下所示:

更新 最后,我修复了画布坐标的转换,如下公式所示:

var cx=((x&0x3fffffff)/0x3fffffff*画布宽度)0
现在,像素坐标的格式不像使用模运算时那样错误


更新的fiddle:

对于生成器,公式是(您在第一部分中忘记了模数):

我意识到您试图对其进行优化,因此我更新了小提琴,以便您可以将其用作优化的基础:


是的,看起来你解决了。我也做过同样的事

线性同余生成器的形式为:

seed=(seed*因子+偏移量)%范围;
但是,最重要的是,当从中获取实际随机数时,以下不起作用:

random=seed%random\u最大值;
这不起作用,因为第二个模量似乎抵消了生成器的影响。相反,您需要使用:

random=floor(种子/范围*random_最大值);
(这将是一个随机整数;删除
floor
调用以获得随机浮点。)


最后,我将警告您:在JavaScript中,当处理超过dword限制的数字时,会丢失精度。因此,LCG的随机结果可能是随机的,但它们很可能不匹配C++中实现的LCG的结果或实际上支持DWORD数学的另一种低级语言。
此外,由于不精确,LCG的周期极有可能大大缩短。因此,例如,您引用的glibc LCG的周期可能是40亿(也就是说,在重新开始并重新生成完全相同的数字集之前,它将生成超过40亿个随机数)。这个JavaScript实现可能只得到10亿,或者可能要少得多,因为当乘以因子时,这个数字超过了40亿,并且在这样做时失去了精度。

对我来说,这个值好像减少了1?也许应该是2^31+1?我制作了一个动画来显示不同的值。嗨,肯,你说得对,我两个画布坐标都不正确。最后我使用了这个转换:
varcx=((x&0x3fffffff)/0x3fffffff*canvasWidth)0谢谢你的帮助!顺致敬意,
current = (multiplier * current * modul + addend) % modulus) / modulus