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

标签 algorithm random prng perlin-noise

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

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

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

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

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

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

最佳答案

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

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

关于algorithm - 从四个整数生成无状态伪随机数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24972045/

相关文章:

algorithm - 用于聚类(和分类)短句的 NLP 词袋/TF-IDF

javascript - 用JS生成随机单词列表

python - 简单的 PRNG 算法有不同的 Python/C 输出 - 整数溢出差异?

CUDA 中的随机数生成器

algorithm - 两个节点之间最便宜且最短的路径

algorithm - 求所有 n 位二进制数,其中 r 个相邻数字为 1

php - 从目录中随机选择两个(唯一的)图像

python - 哪些平台提供 SystemRandom?

用于删除数组上的子目录的 PHP 函数方法

c - 将随机文本附加到文件 (C)