如何用种子和输入制作伪随机数发生器?

时间:2018-03-21 17:36:36

标签: javascript random

我正在尝试制作一个伪随机地图生成器,我遇到了问题,以便找到一个获得“随机”数字的正确方法。

我需要使函数能够接受一组坐标(x和y)并根据它返回一个伪随机数,并且它们必须始终是精确输入的确切数字。

另外,我不需要一个随机发生器,我的地图需要高度,湿度和温度,所以我需要几个。这就是为什么我需要能够插入一个种子或第三个“坐标”,以便为每个礼物获得不同的数字。

实际上,我在互联网上找到了这样的东西(我将3个功能组合在一起),但它不接受3个输入:

function PRNG(seed) {
  seed = seed % 2147483647;
  if (seed <= 0) {
    seed += 2147483646;
  }
  random = (seed * 16807) % 2147483647;
  return (random - 1) / 2147483646;
}

我不了解按位操作和PRNG所以我不知道如何修改此功能。

我的想法是做一些非常简单的事情,但我不知道这是否仍然是PRNG或我的修改已经打破了它:

function PRNG(seed, x, y) {
  seed = seed % 2147483647;
  if (seed <= 0) {
    seed += 2147483646;
  }
  random = (seed * 16807 + x * 1234 + y * 4321) % 2147483647;
  return (random - 1) / 2147483646;
} 

此外,我不认为seed的概念与xy的工作原理相同,因为我不希望3个输入是附加的(种子) + x + y),因为这意味着它们可以是交换的,例如:坐标(种子,3.5,1)几乎与(种子,0.25,3.5)相同(可以在地图中以奇怪的模式转换,我想),它应该是不同的,但我不知道如何

从我的原始测试(10M迭代和平均值的循环),它似乎是随机的,平均数为0.49925(而不是0.50)。

P.S:我知道这个问题有点奇怪,如果您认为这应该迁移到Code Review或者删除我会这样做。

0 个答案:

没有答案