2013-08-03 2 views
1

16 비트 PRNG에 대해 this algorithm을 찾았습니다. 나는 x, y, t가 무엇인지 이해하지 못한다. 16 비트 시드를 사용하여 여러 개의 임의의 16 비트 값을 생성하고 싶습니다.이 16 비트 PRNG에 대한 이해

내가 맞다면 그 웹 페이지 (아래에 인용)에 표시된 함수는 의사 코드 일뿐입니다. 왜냐하면 x와 y는 함수의 지역 변수이기 때문에 항상 같은 값을 생성하기 때문입니다.

uint16_t rnd_xorshift_32() { 
    static uint16_t x=1,y=1; 
    uint16_t t=(x^(x<<5)); 
    x=y; 
    return y=(y^(y>>1))^(t^(t>>3)); 
} 

어떻게 위는 (시드가 미리 설정되어있는 것) 전역 변수 uint_16_t random을 읽고 수정 될 수 있고, 그 다음 임의의 값으로 덮어?

편집 : 고마워요. 그래서 정적 변수에 대한 제 이해가 수정되었습니다. xy이 시드 (위의 코드에서 모두 1)로 초기 설정되었다고 말하면서 이후의 임의의 값이되도록 수정하겠습니까? 그리고 t은 임시 변수입니까?

+1

정적입니다. 값은 호출간에 유지됩니다. 정적 선언도 한 번만 사용되므로 1에서 시작하여 더 이상 실행되지 않고 다음 호출을 위해 메모리에 보관됩니다. –

+2

그들은 지역 변수이지만 자동 저장 기간을 가지고 있지 않습니다 -'정적'은'x'와'y'가 항상 변수의 동일한 인스턴스를 참조한다는 것을 의미합니다. 그들은 함수 호출간에 지속됩니다. –

+0

가능한 [C 프로그램의 "정적"의미는 무엇입니까?] (http://stackoverflow.com/questions/572547/what-does-static-mean-in-ac-program) –

답변

3

변수 xy은 실제로 사용자가 의미하는 의미에서 함수에 "로컬"이 아닙니다. 그들은 static으로 선언됩니다. 이는 범위 인이 기능에 국한되어 있으며 (외부에서 이름으로 액세스 할 수 없음), 수명이 인 것은 전체 프로그램의 것입니다. 따라서 호출간에 값을 유지하게됩니다. 이는 두 가지를 의미합니다.

  • x 및 y는 실제로 PRNG 상태입니다.
  • 이 함수는 스레드로부터 안전하지 않습니다.
+2

C99 6.2.4 : 3 정적 변수 : "그 수명은 전체 실행"입니다. 함수의 첫 번째 호출에서부터 마지막 ​​(마지막 이전)까지의 공식은 간단하지 않고 간단하지 않고 공식 주소와 일치하지 않습니다. 그것이 로컬 인 함수의 마지막 호출. –

+0

인용 해 주셔서 감사합니다. 내 앞에서 표준을 지키지 않아서, 나는 고의적으로 보수적 이었지만, 당신의 요지는 잘 받아 들여졌다. 그것이 C99 이전에 동일했는지 아십니까? –

+1

C89의 해당 문장은 "해당 개체가 존재하며 프로그램 전체를 통해 마지막으로 저장된 값을 유지합니다." –