[编辑:帖子原本太长了,正在尝试将其缩短!]
要构建一些基于VNode的应用程序,我需要一个函数,该函数可以生成3或4个字节大小的伪随机数,用作唯一ID。
考虑一个随机的RGB或RBBA,类似于CSS的字符串颜色,例如'bada55'或'900dcafe'...例如,用户可以通过在PNG图像中选择一个随机像素来为生成器设置种子。
由于我的应用程序在功能方面,生成器必须具有纯副作用,例如:使用Math.random ...
我不了解算术理论(我的课程迄今为止...),但是我决定使用乘载乘数(MWC)范例来滚动自定义PRNG,并用一些素数进行经验测试系数和颜色随机的种子。
我的想法是用1字节,2字节,3字节然后是4字节的输出进行测试:我的感觉是:
[在这里编辑]
MCW通常按以下方式工作:
# each turn, compute the i-th byte:
Xi[i] = A * Zi[i] + Ci[i]
Ci[i] = Math.floor((A * Zi[i] + Ci[i]) / M)
Zi[i] = Xi[i] % M
其中A是乘数,C是增量,M是模数。对于字节,模数为256。
可以通过数学方式确定A和C(素数)以获得完整的周期发生器。
麻烦的是,当一个字节单元开始循环到其种子值时,所有单元都会这样做...因此,周期为4个字节为256个!
我需要构建一个类似里程表的东西来偏移其他单元格的值,并保证Math.pow(256,4)为准。
如果可能,如何以简单的方式实现这一目标?