从四个整数生成无状态伪随机数

时间:2014-07-26 14:29:46

标签: algorithm random prng perlin-noise

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

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

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

我看到的现有Perlin噪声实现将每个整数与一个大素数相乘,添加结果,对其进行一些操作并通过 n 进行除法提示。我不想复制这个,因为我不了解它的一些事情:

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

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

1 个答案:

答案 0 :(得分:3)

如果您有任意精度伪随机数生成,那么您可以只连接四个输入(x,y,z,种子)并在此输入上调用伪随机数生成器函数以获得" next& #34;伪随机数,它将作为你的随机数。 (如果你想要一个介于1和n之间的随机数,则取适当数量的高位)。

您提到的实现使用的事实是,当与输入整数相乘时,不同的大素数(模n)会产生基本上不相关的结果(模n)。当然,你需要你的输入整数,并不是所有的都有一个通用的公约数除了n才能使它工作。这就是进行额外位操作的原因,因此如果所有输入整数都可以被k整除,并且n可以被k整除,则模数n的余数也不会自动被k整除。无论如何,人们已经对已建立的伪随机数生成器进行了大量的思考,所以我对你的建议是你相信他们考虑了所有潜在的问题并且他们的发电机是好的"如果有很多人在没有投诉的情况下使用它。