我几乎没有使用随机生成器的经验。我在C中使用了标准的rand函数,我使用了perlin噪声。
但是现在,我需要一个分辨率为NxNxN(N可能是1e6或更大)的立方体,其中充满白噪声(没有perlin光滑度或其他),我可以选择"选择"一个值,如果我重新输入相同的值,每次都应该是相同的结果。它应该是种子,所以如果我再次启动应用程序,结果必须是相同的。它不应该是安全的或其他任何东西,只是随机的,以便人类不应该通过思考来预测价值。如果他真的用计算机对它进行分析,那么它是可以预测的。
就像我会使用标准的C rand函数,设置种子并为3维做一个嵌套的for循环并每次生成一个随机数,直到我到达坐标。那当然非常慢。我需要一些快速的东西!
我在互联网上搜索过,但同时发现了很多东西。也许我正在寻找错误的关键字,但我找不到任何可以使用的关键字。
任何人都可以帮助我开始吗?码?一条链接?如果我理解算法,我真的不在乎,但它应该易于实现和使用,并且应该特别快。
答案 0 :(得分: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和?之间创建randoms。在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);
通过这种方式,您实际上可以自由地进行随机化,并且您可以完全控制细节。
这解决了我的问题。