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的数字的可能性。这只是正弦函数工作方式的结果 相反,您可以尝试使用名为的方法(以原始论文的作者命名,非常好)。它分布均匀,速度相当快。给定一个种子,它的工作原理如下:
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%
更多的结果。