2013-10-08 3 views
1

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 

문제는 제가 계산 한 것입니다.

예 : 나는이 두 기사에 내 코드를 기반으로 항상 반환

f1 = get_noise_function(1, 10) 
print f1(1) 
print f1(2) 
print f1(3) 
print f1(1) 

을 - 0.281790983863, 더 높은 차원 및 다른 씨에조차.

문제는 C/C++에서 오버플로가 계산의 일부이며 모든 것이 작동한다는 것입니다. 파이썬에서는 거대한 수를 계산합니다.

이 문제를 해결하거나 가능한 경우 특정 시드가 항상 동일한 값을 반환하기 때문에 시드 된 후 의사 랜덤 함수를 생성하는 방법은 무엇입니까?

[EDIT] 코드가 수정되었습니다. 이제 작동합니다. 휴고 엘리아스에서 참조 된 코드가

답변

1

:

x = (x<<13)^x 

을 당신은 : 당신이 효과적으로 에 8192 * n을 인상하는 동안

n = (n << 13) ** n 

나는 엘리야가 비트 XOR을하고 있다고 생각 n의 힘
. 그것은 당신에게 큰 가치를 제공합니다. 그런 다음

nn = (n * (n * n * 60493 + 19990303) + 1376312589) & 0x7fffffff 

은 거대한 n을 취해서 마지막 31 비트 이외의 모든 것을 버릴 때까지 더 크게 만듭니다. 그것은 ;-) 많은 이해가되지 않습니다

시도는 당신의 코드를 변경 :

n = (n << 13)^n 

하고 도움이 있는지 여부를 확인.

+0

그래, 그게 다야. 수학을 많이 읽은 후에 나는 그것이 지수라고 생각했습니다. 나는 또 다른 버그 (오타)를 수정했고 이제는 작동한다. 또한, 거룩한 쓰레기! 나는 Tim Peters가 대답했다! –