因此,在過去的幾天裏,我一直致力於用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,但它沒有任何區別。這很奇怪,因爲我真的認爲這是行得通的。不管怎麼說,多謝拉, :) –