0

所以在过去的几天里,我一直在制作一个用 java 编写的过程生成程序,但是每当我输出时,它就会出现一个像纸一样的水洗纹理。我不明白它为什么这样做,虽然它很酷,但我想知道是否有人可以向我解释我的程序是如何达到这个结果的。

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

我期待这个逻辑可以创建一个更像云的高度图,但它给了我这个:

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

4

2 回答 2

0

Nicholas,

I apologize in advance if this is incorrect, but looking over your code and compiling it myself I have found the pattern is largely dependent on the mshift variable. If you set it to a relatively large number (for my purposes, I set it at 1000), you will find a lot more static and white noise. Conversely, if you set it relatively low (for my purposes, I set it at 10), you will get the ocean wave-like or washed paper description you gave.

I would assume, with out much testing, that the image created has a lot to do with the fact that you go through each x value before the corresponding y.

I don't have much more time to contribute to this, as I have my own project that is due at 11:59PM today, but perhaps a project I did a while back might help you. I made a paste in case you found benefit in it:

http://pastebin.com/c0umWA1N

于 2013-09-27T17:47:14.910 回答
0

您正在使用java.util.Random生成纹理。当然,计算机中没有什么是真正随机的。标准 Java 库使用经典的线性同余伪随机数生成器,它对大多数用途来说速度快且效果好,但对于严重的事情仍然被认为是弱的。我所说的“弱”是指它可以被预测并在密集使用时表现出“非随机性”。这可能是您在此处看到的模式的来源。

另一个可能的问题来源是您首先生成一个随机种子数组。但是,如果您查看Random.next()in的实现java.util

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

您会看到 Random 的过程是生成一个新种子并根据对该种子的简单计算返回一个值。我没有数学背景来确定这一点,但也许这种技术会产生一个种子列表,当你之后使用它们时会产生类似的伪随机序列,因为它们以某种方式相互依赖,已经由同一个随机生成器生成,并且还会生成模式。

您可以尝试什么:使用更好的伪随机生成器。您可以使用java.security.SecureRandom“密码学强大”的 ,因此它应该足以满足您的使用需求。不幸的是,它没有java.util.Random. 但你至少可以试一试,看看你是否找到相同的模式。如果不是,那么随机生成器是坏的;如果您仍然找到模式,那么很可能它来自您的算法。

如果我说伪随机生成器不够随机,并且SecureRandom对您来说太慢的话,您可以在网上找到“Mersenne Twister”算法的实现,它比线性同余方法更快更好。

于 2013-09-27T18:05:15.430 回答