每当我需要随机的东西时,我都试图使用Math.random()
创建一些世界生成机制,但后来决定我希望它基于种子,所以,鉴于种子,我改变了所有{{1}希望它会做同样的事情,但如果种子是同一个种子,那么它将是相同的。{}}
然后有人让我注意到sin wave没有得到均匀的分布,最后我看到为什么我的一些代码工作奇怪了。
我想知道是否有一个简单的修复,或者如果没有,另一个非常简单的基于种子的随机发生器就像这样
答案 0 :(得分:1)
所以,我看了你的方法,t1wc,我发现它实际上并不是均匀分布的。例如,吐出0或接近1的数字的可能性要大于吐出接近0.5的数字的可能性。这只是正弦函数工作方式的结果。
相反,您可以尝试使用名为Blum Blum Shub的方法(以原始论文的作者命名,非常好)。它分布均匀,速度非常快。鉴于种子,它的工作原理如下:
以下是Blum Blum Shub的简单实现:
var SeededRand = function(seed, mod1, mod2)
{
return function()
{
seed = (seed*seed) % (mod1*mod2);
return seed/(mod1*mod2);
};
};
如果您想创建一个新的随机数生成器,只需调用:
var rand = SeededRand(seed, mod1, mod2);
种子是一些初始种子(1234567890效果很好),mod1和mod2是一些大质数(7247和7823效果很好)。 rand
只是我定义为保存输出的变量。
现在,要开始获取随机值,只需调用:
rand();
每次运行时都会吐出不同的值。
如果您有任何疑问,请询问!
答案 1 :(得分:0)
已经制作了一个非常好的基于种子的随机化脚本。它可以找到here。
答案 2 :(得分:0)
(((Math.sin(seed.value++)/2+0.5)*10000)%100)/100
它发出的数字甚至可以传播,我猜它比我见过的任何其他数字生成器简单得多