Вы используете 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
слишком медленный для вас, вы можете найти в Интернете реализацию алгоритма «Мерсенн Твистер», который быстр и лучше, чем линейный конгруэнтный метод.
Я попытался заменить свои Randoms на безопасные randoms, но это не имело никакого значения. Что странно, потому что я действительно думал, что это сработает. В любом случае спасибо, :) –