2012-07-23 5 views
1

랜덤 생성기 사용 경험이 거의 없습니다. C에서 표준 rand 함수를 사용했고 perlin 노이즈를 사용했습니다.임의로 액세스 할 수있는 시드 3D 화이트 노이즈 랜덤 생성기

하지만 지금은 NixNxN (N은 1e6 이상, N은 1e6 이상)의 화이트 큐브가 필요합니다. , 매번 같은 결과를 가져야합니다. 시드 (seeding)되어야하므로 응용 프로그램을 다시 시작하면 결과가 동일해야합니다. 인간이 단지 사고로 가치를 예언 할 수 없도록 충분히 무작위 적이거나 안전하지 않아야합니다. 그가 컴퓨터로 그것을 정말로 분석한다면 그것은 예측 가능합니다.

표준 C 랜드 함수를 사용하여 시드를 설정하고 3 차원의 중첩 for 루프를 수행하고 매번 난수를 생성하여 좌표에 도달 할 때까지 사용할 수 있습니다. 그것은 물론 끔찍하게 느립니다. 나는 빠른 것을 필요로한다!

나는 인터넷을 검색하여 동시에 많은 것을 발견했다. 어쩌면 잘못된 키워드를 찾고 있을지 모르지만 사용할 수있는 것을 찾지 못했습니다.

아무도 도와 드릴 수 있습니까? 암호? 링크? 알고리즘을 이해하면 실제로 신경 쓰지 않지만 구현 및 사용이 쉬워야하며 특히 빨라야합니다. 아무도 질문에 대답 할 수있을 것 같다 때문에

답변

0

,이에 연구되어 왔고 나는 다음과 같은 sollution 그것을 해결 한 :

int pseudoRandom(int &seed) 
{ 
    const int a = 16807; // 7^5 
    const int m = 2147483647; // 2^31 - 1 
    seed = int(unsigned(seed * a) % m); 
    return seed; 
} 

나는 위의, 잘 알려진 임의의 기능을. 셰이더 언어로 쉽게 변환 될 수 있고 64 비트 int 또는 다른 것으로 쉽게 확장 될 수 있으므로 좋은 기능입니다.

이제 0.0과? 사이의 무질서를 만들 수 있어야합니다. 3 차원에서 그리고 그들은 항상 동일한베이스 - 시드와 같은 결과를 가져야합니다. 그래서 모든 컴포넌트 x, y, z의 정수 부분과 기본 시드를 취했습니다.

int seed = baseseed; 
pseudoRandom(seed); 
pseudoRandom(seed * (int(x) + seed) * (int(y) + seed) * (int(z) + seed); 

=> seed가 이제 자세한 임의의 격자를 만들 수있는 값에 있습니다. 32x32x32 임의 값의 세부 정보가 필요하면 여기에 배열로 생성하면됩니다. 내가 더 큰 배열을 필요로했을 경우 , 나는 일을 같이 다른 레이어를 생성하기 위해 다시 같은 단계를 수행 할 수 :

pseudoRandom(seed * (int(x * 100) + seed) * (int(y * 100) + seed) * (int(z * 100) + seed); 

이 방법, 당신은 당신이 무작위 방법에 매우 무료 사실이야, 당신은이 세부 사항 전체 제어.

내 문제가 해결되었습니다.