代码之家  ›  专栏  ›  技术社区  ›  user3426575

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

  •  1
  • user3426575  · 技术社区  · 12 年前

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

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

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

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

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

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

    1 回复  |  直到 12 年前
        1
  •  3
  •   user2566092    12 年前

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

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