2013-09-27 73 views
0

因此,在过去的几天里,我一直致力于用java编写程序生成程序,然而无论何时输出时,它都会产生一种像纸张一样的水洗纹理。我不明白为什么它正在这样做,虽然这很酷,但我想知道是否有人可以向我解释我的程序是如何达到这个结果的。奇怪的3D程序生成输出

来源:http://pastebin.com/frCh03VW

我期待这样的逻辑,以创建像高度图更浊,而是它给了我这样的:

大图:http://i.imgur.com/8MXRBNk.jpg

回答

0

尼古拉斯,

我如果这是不正确的,请提前道歉,但是查看你的代码并自己编译,我发现这个模式在很大程度上取决于mshift变量。如果将其设置为相对较大的数字(对于我的用途,我将它设置为1000),则会发现更多静态和白色噪音。相反,如果你把它设置得相对较低(为了我的目的,我把它设置为10),你会得到你给的海浪状或者纸质的描述。

我会假设,经过很多测试,创建的图像与事实有很大关系,因为您在相应的y之前检查每个x值。

我没有更多的时间来促成这一点,因为我有我自己的项目,是因为今天晚上11:59,但也许一个项目,我做了一段时间后可能会帮助你。我做的情况下,你发现受益于它贴:

http://pastebin.com/c0umWA1N

0

您正在使用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”算法的实现,它比线性同余方法。

+0

我试图用Secure-randoms替换我的Randoms,但它没有任何区别。这很奇怪,因为我真的认为这是行得通的。不管怎么说,多谢拉, :) –