Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/432.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 基于种子的sin世界生成_Javascript_Random_Trigonometry_Random Seed - Fatal编程技术网

Javascript 基于种子的sin世界生成

Javascript 基于种子的sin世界生成,javascript,random,trigonometry,random-seed,Javascript,Random,Trigonometry,Random Seed,每当我需要一些随机的东西时,我就尝试使用Math.random()来创建一些世界生成机制,但后来我决定要它基于种子,所以,给定一个种子,我将所有Math.random()更改为Math.sin(seed++)/2+0.5,希望它也能做同样的事情,但如果种子是同一粒种子的话,它也会是同一粒种子。 然后有人让我注意到正弦波没有得到均匀分布,最后我明白了为什么我的一些代码工作异常。 我想知道是否有一个简单的修复程序,或者如果没有,另一个非常简单的基于种子的随机化程序,像这样已经制作了一个非常好的基于种

每当我需要一些随机的东西时,我就尝试使用
Math.random()
来创建一些世界生成机制,但后来我决定要它基于种子,所以,给定一个种子,我将所有
Math.random()
更改为
Math.sin(seed++)/2+0.5
,希望它也能做同样的事情,但如果种子是同一粒种子的话,它也会是同一粒种子。 然后有人让我注意到正弦波没有得到均匀分布,最后我明白了为什么我的一些代码工作异常。
我想知道是否有一个简单的修复程序,或者如果没有,另一个非常简单的基于种子的随机化程序,像这样

已经制作了一个非常好的基于种子的随机化脚本。可以找到。

好了,伙计们,我发现这才是我真正想要的:

(((Math.sin(seed.value++)/2+0.5)*10000)%100)/100

它发送的是均匀分布的数字,我想它比我见过的任何其他数字生成器都简单得多。所以,我查看了你的方法t1wc,发现它实际上并不是均匀分布的。例如,它吐出接近0或接近1的数字的可能性明显高于吐出接近0.5的数字的可能性。这只是正弦函数工作方式的结果

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

  • 将种子平方,并将结果放入临时变量(x)
  • 取x基M的模
  • M是两个大素数的乘积
  • x的值是一个新的种子,用于将来的计算
  • 返回x/M作为伪随机数。它将在0和1之间均匀分布
  • 下面是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);
    
    rand();
    
    其中seed是一些初始种子(1234567890工作得很好),mod1和mod2是一些大素数(7247和7823工作得很好)
    rand
    只是我定义用来保存输出的一个变量

    现在,要开始获取随机值,只需调用:

    var rand = SeededRand(seed, mod1, mod2);
    
    rand();
    
    每次运行时,它都会输出不同的值


    如果你有任何问题,请提问

    @Barmar的可能重复我实际上从那个问题的一个答案中选取了这个公式,并且非常喜欢它,所以我想知道是否有一个简单的解决方法,我在那个问题中没有看到你的公式。我使用
    Math.sin
    看到了其他答案,但它们是通过取分数的一些数字并将它们转换成整数来工作的。由于sin是无理的,因此数字序列实际上是随机的。不幸的是,这不是均匀分布的。我对它进行了
    100000000次
    测试,在
    0.01和
    0.99附近得到了
    150%
    更多的结果。