나는 각 숫자를 생성하기 전에 씨앗이 주어 졌을 때 빠르게 작동하는 의사 난수 생성기를 찾고 있습니다. 지금까지 본 대부분의 생성자는 시드를 한 번 설정 한 다음 긴 숫자 시퀀스를 생성한다고 가정합니다. 지금까지 필자가 보아 왔던 것과 비슷한 것은 Perlin Noise 뿐이지 만 유사한 "너무"부드러운 데이터를 생성합니다. 유사한 입력의 경우 유사한 결과를 생성하는 경향이 있습니다.절차적인 내용을위한 빠른 의사 난수 생성기
과 같이 보일 것입니다 발전기의 선언 :
int RandomNumber1(int seed);
또는 :
int RandomNumber3(int seedX, int seedY, int seedZ);
나는 그것의 입력을 해싱에 의해 RandomNumber3을 구현하기 위해 가능한 한 좋은 RandomNumber1이 충분해야한다 가진 생각을 결과를 RandomNumber1에 전달하지만 일부 구현에서는 독립적 인 입력을 사용할 수 있도록 2 차 프로토 타입을 작성했습니다.
이 생성기의 용도는 그리드에 나무를 놓고 숲을 생성하고 각 위치에 대해 임의의 나무 종과 임의의 공간 오프셋을 결정하는 등의 절차 콘텐츠 생성기에 사용하는 것입니다.
발생기는 렌더링 과정에서 절차 내용이 실시간으로 대량 생성되므로 매우 효율적이어야합니다 (500 CPU주기 미만).
Perlin 노이즈가 비슷한 이유는 Perlin 노이즈가 결정적인 (반복 가능한) 의사 난수 함수를 사용하여 작업의 일부를 수행 한 다음 결과를 부드럽게 만드는 것입니다. Perlin 노이즈 구현, 특히 이전에 개선 된 초기 Perl 노이즈 구현을 보면 언어, 도메인 및 범위가 다양하지만 효율적이고 반복 가능한 "임의"함수 유형을 자주 찾을 수 있습니다. 예 : 'RandomNumber (vec2 seed, float x, float y) {return fract (sin (도트 (시드 + vec2 (fx, fy), vec2 (12.9898,78.233))) * 43758.5453); }'(GLSL ES) – LarsH
나는이 질문을 연구하려고 노력해 왔으며, "발전기"라는 단어는 우리가 피하려고하는 순차적 인 스트리밍 동작을 의미한다는 결론에 도달했습니다. 이것이 PRN ** G **가 일반적으로 엄격한 결정 론적 기능이 아닌 상태 보존 기능을 제공하는 것으로 이해되는 이유입니다. 아마도 우리가 PRNG가 아닌 PRNF (기능)를 찾으면 연구에서 더 나은 성공을 거둘 수있을 것입니다. https://blogs.unity3d.com/2015/01/07/a-primer-on-repeatable-random-numbers/은 "임의의 해시 함수"라고합니다. – LarsH