因此,在过去的几天里,我一直致力于用java编写程序生成程序,然而无论何时输出时,它都会产生一种像纸张一样的水洗纹理。我不明白为什么它正在这样做,虽然这很酷,但我想知道是否有人可以向我解释我的程序是如何达到这个结果的。奇怪的3D程序生成输出
来源:http://pastebin.com/frCh03VW
我期待这样的逻辑,以创建像高度图更浊,而是它给了我这样的:
大图:http://i.imgur.com/8MXRBNk.jpg
因此,在过去的几天里,我一直致力于用java编写程序生成程序,然而无论何时输出时,它都会产生一种像纸张一样的水洗纹理。我不明白为什么它正在这样做,虽然这很酷,但我想知道是否有人可以向我解释我的程序是如何达到这个结果的。奇怪的3D程序生成输出
来源:http://pastebin.com/frCh03VW
我期待这样的逻辑,以创建像高度图更浊,而是它给了我这样的:
大图:http://i.imgur.com/8MXRBNk.jpg
尼古拉斯,
我如果这是不正确的,请提前道歉,但是查看你的代码并自己编译,我发现这个模式在很大程度上取决于mshift变量。如果将其设置为相对较大的数字(对于我的用途,我将它设置为1000),则会发现更多静态和白色噪音。相反,如果你把它设置得相对较低(为了我的目的,我把它设置为10),你会得到你给的海浪状或者纸质的描述。
我会假设,经过很多测试,创建的图像与事实有很大关系,因为您在相应的y之前检查每个x值。
我没有更多的时间来促成这一点,因为我有我自己的项目,是因为今天晚上11:59,但也许一个项目,我做了一段时间后可能会帮助你。我做的情况下,你发现受益于它贴:
您正在使用java.util.Random
生成你的纹理。当然,电脑中什么都不是随机的。标准的Java库使用经典的linear congruential pseudorandom number generator,这对于大多数用途来说是快速且良好的,但对于严重的东西仍然很弱。通过“弱”我意味着它可以预测,并在密集使用时展现“非随机性”。这可能是你在这里看到的模式的来源。
问题的另一个可能的来源是您首先生成一个随机种子数组。但是,如果你在java.util
看看Random.next()
实现:
protected int next(int bits) {
long oldseed, nextseed;
AtomicLong seed = this.seed;
do {
oldseed = seed.get();
nextseed = (oldseed * multiplier + addend) & mask;
} while (!seed.compareAndSet(oldseed, nextseed));
return (int)(nextseed >>> (48 - bits));
}
你看,随机的过程是产生新的种子,并返回基于对种子一个简单的计算值。我没有数学背景来确定这一点,但也许这种技术会产生一个种子列表,当你以后使用它们时会产生类似的伪随机序列,因为它们以某种方式相互依赖,已经由相同的随机发生器产生,并且也会产生模式。
你可以尝试什么:使用更好的伪随机生成器。您可以使用java.security.SecureRandom
,这是“保密性强”,所以它应该是您的使用情况不够好。不幸的是,它没有java.util.Random
那么快。但你至少可以尝试一下,看看你是否找到了相同的模式。如果没有,那么随机发生器是坏的;如果你仍然发现模式,那么很可能它来自你的算法。
如果我正确地说,伪随机生成器不够随机,如果SecureRandom
对你来说太慢,你可以在网上找到一个“Mersenne Twister”算法的实现,它比线性同余方法。
我试图用Secure-randoms替换我的Randoms,但它没有任何区别。这很奇怪,因为我真的认为这是行得通的。不管怎么说,多谢拉, :) –