2012-07-23 129 views
1

我几乎没有随机发生器的经验。我在C中使用了标准的rand函数,并且我使用了perlin噪声。但现在,我需要一个分辨率为NxNxN(N可能是1e6或更大)的立方体,里面充满了白噪声(没有perlin平滑或其他),我可以在其中选择一个值,如果我重新输入相同的值,每次都应该是一样的结果。它应该有种子,所以如果我再次启动应用程序,结果必须相同。它不应该是安全的或任何其他的,只是随机的,以便人类不应该能够通过思考来预测价值。如果他真的用电脑进行分析,可以预测。随机访问种子3D白噪声随机发生器

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

我搜查了互联网,发现很多,没有在同一时间。也许我正在寻找错误的关键字,但我还没有找到任何可以使用的关键字。

任何人都可以帮助我开始吗?码?一条链接?我并不关心我是否理解这些算法,但它应该易于实现和使用,并且应该特别快速。

回答

0

因为似乎没有人能回答这个问题,我一直在研究这个,我有以下sollution解决它:

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

这样,你实际上你如何随机相当自由,你有完全控制细节。

这解决了我的问题。