用随机存取的方式生成种子3D白噪声随机数发生器

5
我对随机生成器几乎没有经验,我使用过C语言中的标准rand函数和Perlin噪声。
但是现在,我需要一个分辨率为NxNxN(其中N可能为1e6或更大)的立方体,用白噪声填充(没有Perlin平滑或其他),我可以“选择”一个值,如果我重新选择相同的值,则每次都应该是相同的结果。它应该被种子化,以便如果我再次启动应用程序,结果需要相同。它不应该是安全的或其他什么,只要足够随机,以至于人类不能通过思考来预测价值。如果他真的用计算机分析它,那么它是可以预测的。
就像我将使用标准的C rand函数,设置种子并在3个维度的嵌套for循环中生成随机数,直到达到坐标。当然,这样做非常慢。我需要一些快速的东西!
我在互联网上搜索了很多,但同时也没有找到什么。也许我正在寻找错误的关键字,但我没有找到任何我可以使用的东西。
有人能帮助我入门吗?代码?链接?我并不在乎是否理解算法,但它应该易于实现和使用,特别是应该快速。
1个回答

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;
}

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

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

int seed = baseseed;
pseudoRandom(seed);
pseudoRandom(seed * (int(x) + seed) * (int(y) + seed) * (int(z) + seed);

=> 种子现在已经到了我可以开始制作详细的随机网格的值。 因此,如果我需要一个32x32x32的随机值细节,我只需在此处生成一个数组。 如果我需要一个更大的数组,我可以再次执行相同的步骤来生成另一层,就像这样:

pseudoRandom(seed * (int(x * 100) + seed) * (int(y * 100) + seed) * (int(z * 100) + seed);

这样,您在随机化方面实际上非常自由,并且可以完全控制细节。

这解决了我的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接