【问题标题】:Generating a stateless pseudo-random number from four integers从四个整数生成一个无状态的伪随机数
【发布时间】:2014-07-26 14:29:45
【问题描述】:

对于 Perlin 噪声的实现,我需要从 n 个向量的静态列表中为 3D 空间中的每个整数坐标选择一个向量。这归结为在 1..n 中从四个有符号整数值 xyz 生成一个伪随机数em> 和 种子

unsigned int pseudo_random_number(int x, int y, int z, int seed);

算法应该是无状态的,即每次调用它时都返回相同的数字,并使用相同的输入值。

我查看的现有 Perlin 噪声实现将每个整数与一个大素数相乘,将结果相加,对其进行一些位操作,并提示除以 n。我不想只是复制它,因为我不了解它的一些内容:

  • 如何选择素数?
  • 为什么要进行额外的位操作?
  • 我如何知道这是否“足够伪随机”以产生视觉上令人愉悦的结果?

我寻找有关 PRNG 工作原理的解释,但找不到有关多个输入值的任何信息。

【问题讨论】:

  • 我认为您不知道要保留“柏林噪声”的哪些属性,因为您已将参数设为整数。

标签: algorithm random prng perlin-noise


【解决方案1】:

如果您有任意精度的伪随机数生成,那么您只需连接四个输入 (x,y,z,seed) 并在此输入上调用您的伪随机数生成器函数以获得“下一个”伪-随机数将作为您的随机数。 (如果你想有一个介于 1 和 n 之间的随机数,然后取适当数量的高位)。

您提到的实现使用了这样一个事实,即不同的大素数模n在与输入整数相乘时会产生本质上不相关的结果(模n)。当然,您需要输入的整数并非都具有带有 n 的通用公约数才能正常工作。这就是为什么要进行额外的位操作的原因,因此如果所有输入整数都可以被 k 整除,并且 n 可以被 k 整除,则余数模 n 也不会自动被 k 整除。无论如何,人们已经对已建立的伪随机数生成器进行了很多思考,所以我对您的建议是,您相信他们考虑了所有潜在问题,并且如果有一大群人使用他们的生成器是“好”的毫无怨言。

【讨论】:

  • 感谢您的解释,这是有道理的。什么是“连接”输入值的合适方法?
猜你喜欢
  • 2011-02-08
  • 2018-04-03
  • 2013-10-10
  • 1970-01-01
  • 2015-08-07
  • 1970-01-01
  • 2013-06-22
  • 2023-01-03
  • 2015-01-28
相关资源
最近更新 更多