具有随机访问功能的种子 3D 白噪声随机发生器

sci*_*pie 5 random seed noise-generator

我对随机生成器的经验几乎为零。我在 C 中使用了标准 rand 函数,并且使用了柏林噪声。

但现在,我需要一个分辨率为 NxNxN(N 可能为 1e6 或更大)的立方体,其中充满白噪声(没有柏林平滑度或其他任何东西),其中我可以“选择”一个值,如果我重新选择相同的值,它应该是每次都是相同的结果。它应该被播种,这样如果我再次启动应用程序,结果需要相同。它不应该是安全的或其他什么,只是足够随机,以至于人类不应该能够仅通过思考来预测值。如果他真的用电脑分析的话,是可以预测的。

就像我会使用标准的 C rand 函数,设置种子并为 3 维执行嵌套 for 循环,并每次生成一个随机数,直到到达坐标。这当然是非常慢的。我需要快速的东西!

我在互联网上搜索过,但同时发现了很多却什么也没有。也许我正在寻找错误的关键字,但我还没有找到任何可以使用的东西。

有人可以帮助我开始吗?代码?一条链接?我并不真正关心我是否理解算法,但它应该易于实现和使用,而且应该特别快。

sci*_*pie 0

由于似乎没有人能够回答这个问题,我一直在研究这个问题,并通过以下解决方案解决了它:

int pseudoRandom(int &seed)
{
    const int a = 16807; // 7^5
    const int m = 2147483647; // 2^31 - 1
    seed = int(unsigned(seed * a) % m);
    return seed;
}
Run Code Online (Sandbox Code Playgroud)

我采用上述众所周知的随机函数。这是一个很好的函数,因为它可以轻松转换为着色器语言,并且可以轻松扩展为 64 位整数或其他类型。

现在,我需要能够创建 0.0 和 ?.? 之间的随机数 在 3 个维度上,它们应该始终具有相同的结果和相同的基本种子,因此我采用了每个分量 x、y 和 z 的整数部分以及一个基本种子。

int seed = baseseed;
pseudoRandom(seed);
pseudoRandom(seed * (int(x) + seed) * (int(y) + seed) * (int(z) + seed);
Run Code Online (Sandbox Code Playgroud)

=> 种子现在的值是我可以开始制作详细的随机网格的值。因此,如果我需要 32x32x32 随机值的详细信息,我只需在此处将其生成为数组即可。如果我需要更大的数组,我可以再次执行相同的步骤来生成另一个层,例如:

pseudoRandom(seed * (int(x * 100) + seed) * (int(y * 100) + seed) * (int(z * 100) + seed);
Run Code Online (Sandbox Code Playgroud)

这样,您实际上可以完全自由地选择随机化方式,并且可以完全控制细节。

这解决了我的问题。