문제

단일 임의의 숫자를 생성 한 다음 해당 숫자를 사용하여 부울 값으로 이론적으로 무한히 큰 2D 평면을 씨앗을 뿌릴 수 있어야합니다. 3 개의 입력 (x, y 및 랜덤 시드)으로 결정 론적으로 호출 할 수있는 함수가 필요하며 의사 랜덤 결과를 다시 반환합니다.

int r = random()
//...
var value_for_point = f(x,y,r);

이 기능을 사용하여 10x10 어레이를 하나와 0으로 채우면 각 셀에 대해 임의의 값을 요구 한 경우와 같은 것과 동일하게 보일 것입니다. 완벽 할 필요는 없습니다. 통계 분석을위한 것이 아닙니다. 동일한 임의의 숫자가 주어진 배열을 재현 할 수 있어야합니다.

나는 두 가지 이유로 임의의 숫자 생성기를 단순히 시드 할 수 없습니다. 먼저,이 기능은 x와 y를 기반으로해야합니다. 이 기능을 호출하여 (0,0)와 (10, 10) 사이의 배열을 채우고 나중에 (-10, -5)와 (3,4) 사이의 값을 요구할 수 있습니다. 둘째, 내가 사용하는 언어에는 종자 기능이 없습니다.

나는 내가 보지 못하는이 일을 할 수있는 사소한 방법이 있거나 그가 나를 도울 수있는 프랙탈 영역이 있다고 확신합니다. 누구 든지이 작업을 수행하는 방법을 알고 있습니까?

도움이 되었습니까?

해결책

나는 당신이 원한다고 생각합니다 Perlin 소음?

다른 팁

100% 완벽하지는 않지만 SHA1 또는 MD5와 같은 통조림 알고리즘을 사용하는 것은 어떻습니까? SHA1은 모든 문자열에서 160 비트의 문자열을 내놓고 더 무작위로 무작위입니다. 10x10 부울 배열을 채우려면 무작위에 가까운 100 비트 만 있으면됩니다. 씨앗으로 알려진 기본 문자열 (모든 길이)으로 시작하기 때문에 값은 재현 가능합니다.

어떤 언어를 사용하고 있는지 모르겠지만 SHA1 및 MD5의 구현은 거의 모든 운영 체제에서 사용할 수 있습니다.

매우 간단한 수학 알고리즘은 매우 복잡한 결정 론적 출력을 생성 할 수 있습니다. 보세요 Wolfram의 책.

예를 들어 사용할 수 있습니다 규칙 30 이것을 생성합니다.

단순한 것을 사용하십시오

private static uint GetUint()
{
    m_z = 36969 * (m_z & 65535) + (m_z >> 16);
    m_w = 18000 * (m_w & 65535) + (m_w >> 16);
    return (m_z << 16) + m_w;
}

초기 값 M_Z 및 M_W를 시드하십시오. 각각 x와 y에 대해 그렇게하십시오.

무한히 큰 비행기를 시뮬레이션 할 수 없습니다. 궁극적으로, 당신은 어떤 종류의 임의의 숫자 생성기가 붙어 있으며, 생성기가 저장할 수있는 상태 비트 수에는 항상 제한이 있습니다.

즉, 한계는 대부분 이론적입니다. 대부분의 실제 목적으로 사용자가 지정한 크기에 따라 평면 크기를 제한 할 수 있습니다. 예를 들어, X와 Y가 2 개의 32 비트 정수 인 경우 2^32-1X2^32-1 인 평면을 시뮬레이션 할 수 있어야합니다. 무한한 방법.

시스템의 무작위 번호 생성기에 대해 말한 내용을 감안할 때, 자신의 생성기를 작성하거나 웹에서 충분히 긴 기존을 사용할 필요가 있습니다. 기간. X 및 Y 좌표에 32 비트를 사용하려면 최소 64 비트 기간의 발전기가 필요합니다.

거기에서 상황은 매우 쉽습니다. X의 비트를 결합하여 선형 주소를 다른 2D 배열에 생성하는 것과 같은 코디네이션을 결합한 다음 결과를 PRNG의 시드로 사용하여 결과를 꺼내십시오.

우리가 언어를 알고 있다면 도움이 될 수 있습니다.

씨#...

static bool GetPixel(int seed, ushort x, ushort y)
{
    int randomSeed = (x << 16 | y) ^ seed;
    Random rnd = new Random(randomSeed); 
    /* if you just want a constant result you can seed the function 
       on app start and never touch the random generator again */
    return rnd.NextDouble() >= .5;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top