C 코드에서 파이썬 소음 기능을 구현 및 노이즈 (펄린, 값 등)이 들어I는 절차 콘텐츠 생성 알고리즘들을 플레이 할
, I는 일반 N 차원을 원하는 시작하기로 결정 노이즈 기능. 이를 위해 주어진 차원의 잡음 생성 함수를 반환하는 함수를 작성했습니다.
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++에서 오버플로가 계산의 일부이며 모든 것이 작동한다는 것입니다. 파이썬에서는 거대한 수를 계산합니다.
이 문제를 해결하거나 가능한 경우 특정 시드가 항상 동일한 값을 반환하기 때문에 시드 된 후 의사 랜덤 함수를 생성하는 방법은 무엇입니까?
[EDIT] 코드가 수정되었습니다. 이제 작동합니다. 휴고 엘리아스에서 참조 된 코드가
그래, 그게 다야. 수학을 많이 읽은 후에 나는 그것이 지수라고 생각했습니다. 나는 또 다른 버그 (오타)를 수정했고 이제는 작동한다. 또한, 거룩한 쓰레기! 나는 Tim Peters가 대답했다! –