Я хочу играть с процедурными алгоритмов генерации контента, и решил начать с шумами (Перлин, значение и т.д.)Реализация функции шума в Python из кода C
Для этого я хочу иметь общий п-мерное шум функция. Для этого я написал функцию, которая возвращает функцию генерации шума данного измерения:
small_primes = [1, 83, 97, 233, 61, 127]
def get_noise_function(dimension, random_seed=None):
primes_list = list(small_primes)
if dimension > len(primes_list):
primes_list = primes_list * (dimension/len(primes_list))
rand = random.Random()
if random_seed:
rand.seed(random_seed)
# random.shuffle(primes_list)
rand.shuffle(primes_list)
def noise_func(*args):
if len(args) < dimension:
# throw something
return None
n = [a*b for a, b in zip(args, primes_list)]
n = sum(n)
#n = (n << 13) ** n
n = (n << 13)^n
nn = (n * (n * n * 60493 + 19990303) + 1376312589) & 0x7fffffff
return 1.0 - (nn/1073741824.0)
return noise_func
, проблема, я считаю, с расчетами. Я на основе моего кода на этих двух статей:
- Hugo Elias' value noise implementation (конец страницы)
- libnoise documentation
Пример одного из моих тестов:
f1 = get_noise_function(1, 10)
print f1(1)
print f1(2)
print f1(3)
print f1(1)
Он всегда возвращается - 0.281790983863, даже при более высоких размерах и разных семенах.
Проблема, я считаю, заключается в том, что в C/C++ происходит переполнение некоторых вычислений, и все работает. В python он просто вычисляет гигантское число.
Как я могу исправить это или, если возможно, как я могу сгенерировать псевдослучайную функцию, которая после посева для определенного ввода всегда возвращает одно и то же значение.
[EDIT] Исправлен код. Теперь это работает.
Да, это было. Прочитав столько математики, я подумал, что это было возвеличивание. Я исправил еще одну ошибку (опечатку), и теперь она работает. Кроме того, святое дерьмо! На меня ответил Тим Петерс! –