Вы используете java.util.Random
для создания текстуры. Конечно, в компьютерах нет ничего случайного. Стандартная библиотека Java использует классический линейный генератор конгруэнтных псевдослучайных чисел, который является быстрым и удобным для большинства целей. , но по-прежнему считается слабым местом для серьезных вещей. Под «слабым» я подразумеваю, что он может быть предсказуемым и проявляет «неслучайность» при интенсивном использовании. Возможно, это источник паттернов, которые вы здесь видите.
Другой возможный источник проблемы заключается в том, что вы сначала создаете массив случайных начальных чисел. Но если вы посмотрите на реализацию 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
слишком медленный для вас, вы можете найти в Интернете реализацию алгоритма «Мерсенн Твистер», который быстрее и лучше, чем метод линейной конгруэнтности .
person
Cyrille Ka
schedule
27.09.2013