2012-09-18 3 views
6

Perlin Noise 알고리즘과 Simplex Noise 알고리즘의 무작위성 품질은 어떻습니까?Perlin/Simplex Noise 알고리즘의 임의성 품질은 어떻습니까?

어떤 알고리즘이 더 나은 임의성을 갖고 있습니까?

표준 의사 랜덤 생성기와 비교하여 Perlin/Simplex를 난수 생성기로 사용하는 것이 합리적입니까?

업데이트 : 나는 Perlin/Simplex Noise가 사용되는 것을 알고 있습니다. 나는 무작위 속성에 대해서만 궁금해.

답변

3

"난수 통계"(AI Game Wisdom 2)에서 언급했듯이 "더 나은"임의성을 생성하는 것은 무엇을 사용하고 있는지에 따라 달라집니다. 일반적으로 PRNG의 품질은 테스트 배터리를 통해 비교됩니다. 인쇄 당시 저자는 PRNG의 무작위성 테스트에 가장 잘 알려진 & 테스트 배터리가 & Diehard이라는 것을 나타냅니다. 또한 how to test random numberswhy statistical randomness tests seem ad-hoc과 관련된 질문을 참조하십시오. 일반적인 PRNG도 테스트 PRNG는 더 복잡으로 펄린 노이즈 또는 단면 소음 테스트의 표준 문제를 넘어

이유는

  1. 내부적 따라서 자신의 출력의 임의성이 기본 PRNG에 의해 영향을하는 PRNG를 필요로 .
  2. 대부분의 PRNG에는 튜너 블 매개 변수가 부족합니다. 대조적으로, 펄린 노이즈는 계속 증가하는 주파수 및 계속 감소하는 진폭을 갖는 하나 이상의 코 히어 런트 노이즈 기능 (옥타브)의 합입니다. 최종 이미지는 사용 된 옥타브의 수와 특성에 따라 다르므로 무작위성의 품질은 이에 따라 달라집니다.
  3. Simplex 노이즈에서 사용되는 차원 수를 "4D 단방향 노이즈의 3D 섹션이 3D 단순 노이즈와 다릅니다."로 변경하면 # 2와 비슷한 인수가 유지됩니다. Stefan Gustavson의 Simplex noise demystified.
5

펠린 노이즈와 단순 노이즈는 유용한 잡음을 발생 시키며 완전히 랜덤하지 않습니다. 이러한 알고리즘은 일반적으로 절차 적으로 생성 된 경관 등을 만드는 데 사용됩니다. 예를 들어, 그것은 이와 (here에서 이미지)으로 지형을 생성 할 수

Heightmap generated by perlin noise

:이 이미지

Terrain generated from perlin noise

를 잡음은 2D 하이트 이와 같은 (here로부터의 화상)을 생성

각 픽셀의 색은 높이를 나타냅니다. 하이트 맵을 생성 한 후 렌더러를 사용하여 이미지의 "높이"(색상)와 일치하는 지형을 만듭니다.

따라서 알고리즘의 결과는 실제로 "임의"가 아닙니다. 당신이 볼 수 있듯이 쉽게 식별 할 수있는 패턴이 많이 있습니다.

Simplex는 아마 더 적은 랜덤 함을 의미하는 조금 더 멋지 겠지만, 주된 목적은 비슷한 노이즈를 생성하지만 더 높은 차원으로 더 잘 조정된다는 것입니다. 즉, 3D, 4D, 5D 노이즈를 발생 시키면 단선 노이즈가 Perlin 노이즈를 능가하며 유사한 결과를 산출합니다.

일반 의사 난수 생성기를 원할 경우 Mersenne twister 또는 other prngs을 확인하십시오. 경고, 암호 해독에, prngs는 경고의 가득 차있을 수있다.

업데이트 :이 노이즈 함수의 임의의 속성으로

(OPS에 따라 업데이트 질문)

, 나는 펄린 노이즈가 입력으로 (매우) 가난한 사람의 PRNG를 사용하고, 수행 알고 인접한 "랜덤"픽셀 간의 일부 평활화/보간 입력 임의성은 실제로 사전 계산 된 임의의 벡터에 대한 의사 임의 색인입니다.

색인은 단순한 정수 연산을 사용하여 계산되며 아무 것도 기발합니다. 예를 들어 noise ++ 프로젝트는 소스 노이즈를 얻기 위해 미리 계산 된 "randomVectors"(here 참조)를 사용하고이 벡터의 다른 값 사이를 보간합니다. 이 알고리즘은 간단한 정수 연산을 사용하여이 벡터에 "임의의"색인을 생성하고 약간의 의사 난수를 추가합니다. 다음은 스 니펫입니다.

int vIndex = (NOISE_X_FACTOR * ix + NOISE_Y_FACTOR * iy + NOISE_Z_FACTOR * iz + NOISE_SEED_FACTOR * seed) & 0xffffffff; 
vIndex ^= (vIndex >> NOISE_SHIFT); 
vIndex &= 0xff; 

const Real xGradient = randomVectors3D[(vIndex<<2)]; 

... 

약간의 랜덤 잡음이 패턴을 생성하고 이웃 픽셀과 블렌딩되어 패턴을 생성합니다.

초기 잡음을 생성 한 후, perlin/simplex 잡음은 잡음의 옥타브 개념을 갖습니다. 즉, 서로 다른 스케일로 노이즈를 재 혼합하는 것입니다.이것은 더 많은 무늬를 만들어 낸다. 따라서 노이즈의 초기 품질은 미리 계산 된 무작위 배열과 psuedorandom 색인 생성의 효과만큼이나 우수합니다. 그러나 그 후 perlin 노이즈가 발생하면 분명히 임의성이 현저히 줄어 듭니다. 실제로는 생각보다 넓은 영역에 퍼집니다.

3

나는 혼란 스럽다고 생각합니다.

펄린과 심플 렉스는 다른 소스에서 임의의 숫자를 취해 을 덜으로 랜덤하게 만들어 자연스러운 풍경처럼 보이게 만듭니다 (임의의 숫자 만 자연 경관처럼 보이지 않음).

그래서 난수가 아닌 다른 곳에서 난수를 처리하는 방법입니다.

및 소스 인 경우에도 좋은 소스가 아닐 수 있습니다 (숫자는 강하게 상관됩니다).