具有 3 个输入的随机数发生器

Random number generator with 3 inputs

提问人:Kotetsu Chan 提问时间:3/10/2022 更新时间:3/10/2022 访问量:446

问:

我正在寻找一个带有 3 个输入的随机数生成器,用于地形生成器。输入是 x、y(位置)和种子值。该函数返回一个从 0-1 开始的随机数。

到目前为止,我找到了这个问题,但这有 2 个输入。虽然我可以将 x 和 y 组合成一个数字,以获得两个输入,但这将限制我对 x、y 的选择,因为它们需要足够大(地形是无限的)。

是否有任何随机函数接受 3 个输入,或者我最终需要使用 2 个输入版本?

随机 语言不可知

评论

0赞 Leo 3/10/2022
这三个输入是什么类型?uint32/uint64/double/别的什么?
0赞 Kotetsu Chan 3/10/2022
uint32 是类型@Leo
1赞 pjs 3/10/2022
您打算为生成器的每次调用传递种子值,这表明对 PRNG 的工作原理存在概念上的误解。频繁的手动播种不会提高伪随机数的质量,实际上通常相反。
1赞 Leo 3/10/2022
@pjs我不认为其目的是提高数字的质量。它是一种可重复的方式,可以从不同的种子生成 2D 地图,同时能够以任意顺序生成点(例如当玩家在他们选择的方向上移动时)。有点像密码的 CTR 模式,但非加密。
1赞 jpmarinier 3/11/2022
这类似于早期的 SO 问题 #61969876。您可以将 x 和 y 与 Cantor 配对功能组合在一起。然后使用配对函数的结果作为一些伪随机系列的偏移量。有效支持这种任意访问的伪随机生成器可以是 CTR 或 MRG,例如 MRG32k3a。这样一来,整个游戏只需要一个种子值。

答:

2赞 Leo 3/10/2022 #1

这样的事情应该可以工作。它采用三个 32 位整数,并输出一个 32 位整数。如果要将输出转换为 0 和 1 之间的双精度,只需除以 。UINT32_MAX

输入和输出大小可以调整。

您还可以调整输出质量和速度之间的平衡。您会注意到中间部分只是重复了 3 行,删除或添加更多行以使输出或多或少有偏差。

下面是 C 代码。

uint32_t rotl32(uint32_t n, uint8_t k) {
  uint32_t a = n << k;
  uint32_t b = n >> (32 - k);
  return a | b;
}

uint32_t three_input_random(uint32_t x, uint32_t y, uint32_t z) {
  uint32_t a = x;
  uint32_t b = y;
  uint32_t c = z;

  b ^= rotl32(a + c, 7);
  c ^= rotl32(b + a, 9);
  a ^= rotl32(c + b, 18);
  b ^= rotl32(a + c, 7);
  c ^= rotl32(b + a, 9);
  a ^= rotl32(c + b, 18);
  b ^= rotl32(a + c, 7);
  c ^= rotl32(b + a, 9);
  a ^= rotl32(c + b, 18);

  return a + b + c + x + y + z;
}

评论

0赞 Anderson Green 6/10/2022
我在 GLSL 中发现了许多噪声函数的实现,也可以用于此目的。