2013-09-27 4 views
0

Так что в течение последних нескольких дней я работал над созданием процедурной программы генерации, написанной в java, однако всякий раз, когда я делаю вывод, он выходит с вымытой бумажной текстурой. Я не понимаю почему это делает это, и, хотя это довольно круто, мне было интересно, может ли кто-нибудь объяснить мне, как моя программа достигает этого результата.Странный 3D Процессный выход генерации

Источник: http://pastebin.com/frCh03VW

Я ожидал, что эту логику, чтобы создать больше облако как высот, но вместо этого он дал мне это:

Большие изображения: http://i.imgur.com/8MXRBNk.jpg

ответ

0

Николас,

I извиниться заранее, если это неверно, но, просматривая свой код и компилируя его, я обнаружил, что шаблон во многом зависит от переменной mshift. Если вы установите его относительно большое количество (для моих целей я установил его на 1000), вы найдете намного больше статического и белого шума. И наоборот, если вы установите его относительно низко (для моих целей я установил его на уровне 10), вы получите описание, напоминающее океанское волнообразное или вымытое описание бумаги.

Я бы предположил, что созданное изображение имеет много общего с тем фактом, что вы проходите каждое значение x до соответствующего y.

У меня не так много времени, чтобы внести свой вклад в это, так как у меня есть собственный проект, который должен состояться сегодня в 23:59, но, возможно, проект, который я сделал некоторое время назад, может вам помочь. Я сделал пасту в случае, если вы нашли пользу в нем:

http://pastebin.com/c0umWA1N

0

Вы используете java.util.Random, чтобы сгенерировать текстуру. Разумеется, на компьютерах нет ничего случайного. Стандартная библиотека Java использует классический linear congruential pseudorandom number generator, который является быстрым и полезным для большинства целей, но по-прежнему считается слабым для серьезных вещей. Под «слабым» я подразумеваю, что он может быть предсказуемым и проявлять «неслучайность» при интенсивном использовании. Возможно, это источник шаблонов, которые вы видите здесь.

Другим возможным источником проблемы является то, что вы сначала генерируете массив случайных семян. Но если вы посмотрите на реализацию Random.next() в 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 слишком медленный для вас, вы можете найти в Интернете реализацию алгоритма «Мерсенн Твистер», который быстр и лучше, чем линейный конгруэнтный метод.

+0

Я попытался заменить свои Randoms на безопасные randoms, но это не имело никакого значения. Что странно, потому что я действительно думал, что это сработает. В любом случае спасибо, :) –

 Смежные вопросы

  • Нет связанных вопросов^_^