Random 带种子的随机存取三维白噪声随机发生器

Random 带种子的随机存取三维白噪声随机发生器,random,seed,noise-generator,Random,Seed,Noise Generator,我几乎没有使用随机生成器的经验。我在C语言中使用了标准的兰德函数,我使用了柏林噪声 但现在,我需要一个分辨率为nxn(N可能为1e6或更大)的立方体,里面填充了白噪声(没有perlin平滑度或其他东西),我可以“拾取”一个值,如果我再次拾取相同的值,每次的结果应该是相同的。它应该是种子,这样如果我再次启动应用程序,结果需要相同。它不应该是安全的或其他的,只是随机的,以至于人类不应该仅仅通过思考来预测价值。如果他真的用计算机来分析,那么它是可以预测的 就像我会使用标准的C rand函数,设置种子并

我几乎没有使用随机生成器的经验。我在C语言中使用了标准的兰德函数,我使用了柏林噪声

但现在,我需要一个分辨率为nxn(N可能为1e6或更大)的立方体,里面填充了白噪声(没有perlin平滑度或其他东西),我可以“拾取”一个值,如果我再次拾取相同的值,每次的结果应该是相同的。它应该是种子,这样如果我再次启动应用程序,结果需要相同。它不应该是安全的或其他的,只是随机的,以至于人类不应该仅仅通过思考来预测价值。如果他真的用计算机来分析,那么它是可以预测的

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

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


有人能帮我开始吗?密码?链接?我真的不在乎我是否理解算法,但它应该易于实现和使用,而且应该特别快。

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

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);
=>seed现在位于我可以开始制作详细随机网格的值上。 所以如果我需要一个32x32x32随机值的细节,我就在这里生成一个数组。 如果我需要一个更大的阵列,我可以再次执行相同的步骤来生成另一层,如:

pseudoRandom(seed * (int(x * 100) + seed) * (int(y * 100) + seed) * (int(z * 100) + seed);
通过这种方式,你实际上可以完全自由地进行随机化,你可以完全控制细节

这解决了我的问题