1

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

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

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

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

谁能帮我开始?代码?一条链接?我真的不在乎我是否理解算法,但它应该易于实现和使用,并且应该特别快。

4

1 回答 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 位整数或其他内容。

现在,我需要能够在 0.0 和 ?.? 之间创建随机数 在 3 个维度上,它们应该始终使用相同的基础种子具有相同的结果,所以我取了每个分量 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);

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

这解决了我的问题。

于 2012-11-14T08:13:22.063 回答