所以在过去的几天里,我一直在制作一个用 java 编写的过程生成程序,但是每当我输出时,它就会出现一个像纸一样的水洗纹理。我不明白它为什么这样做,虽然它很酷,但我想知道是否有人可以向我解释我的程序是如何达到这个结果的。
来源: http: //pastebin.com/frCh03VW
我期待这个逻辑可以创建一个更像云的高度图,但它给了我这个:
大图:http: //i.imgur.com/8MXRBNk.jpg
所以在过去的几天里,我一直在制作一个用 java 编写的过程生成程序,但是每当我输出时,它就会出现一个像纸一样的水洗纹理。我不明白它为什么这样做,虽然它很酷,但我想知道是否有人可以向我解释我的程序是如何达到这个结果的。
来源: http: //pastebin.com/frCh03VW
我期待这个逻辑可以创建一个更像云的高度图,但它给了我这个:
大图:http: //i.imgur.com/8MXRBNk.jpg
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:
您正在使用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”算法的实现,它比线性同余方法更快更好。