使用罪的以种子为基础的世界一代

时间:2014-04-19 14:11:25

标签: javascript random sin random-seed

每当我需要随机的东西时,我都试图使用Math.random()创建一些世界生成机制,但后来决定我希望它基于种子,所以,鉴于种子,我改变了所有{{1}希望它会做同样的事情,但如果种子是同一个种子,那么它将是相同的。{}} 然后有人让我注意到sin wave没有得到均匀的分布,最后我看到为什么我的一些代码工作奇怪了。 我想知道是否有一个简单的修复,或者如果没有,另一个非常简单的基于种子的随机发生器就像这样

3 个答案:

答案 0 :(得分:1)

所以,我看了你的方法,t1wc,我发现它实际上并不是均匀分布的。例如,吐出0或接近1的数字的可能性要大于吐出接近0.5的数字的可能性。这只是正弦函数工作方式的结果。

相反,您可以尝试使用名为Blum Blum Shub的方法(以原始论文的作者命名,非常好)。它分布均匀,速度非常快。鉴于种子,它的工作原理如下:

  1. 将种子平方并将结果放入临时变量(x)。
  2. 取x base M的mod。
  3. M是两个大素数的产物。
  4. x的值是将来用于计算的新种子。
  5. 将x / M作为伪随机数返回。它将均匀分布在0和1之间。
  6. 以下是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

它发出的数字甚至可以传播,我猜它比我见过的任何其他数字生成器简单得多