2012-06-11 2 views
0

메르 센 트위스터를 사용하는 사용자 정의 랜더 마이저 클래스가 있습니다. 사용하는 코드는 this site에서 수정되었습니다. 모두 내가 다른 씨앗을 시험하기 시작할 때까지 (나는 보통 시드를 42로 사용하여 프로그램을 실행할 때마다 결과가 동일하므로 코드 변경이 어떻게 영향을 미치는지 알 수 있습니다).메르 센 트위스터 씨드는 효과가 없습니다.

내가 선택한 시드가 무엇이든간에 코드는 매번 정확히 동일한 일련의 숫자를 생성합니다. 분명히 내가 뭔가 잘못하고있는 것이 분명하지만, 나는 무엇을 모르겠다. 여기 내 종자 기능입니다 :

void Randomizer::Seed(unsigned long int Seed) 
{ 
    int ii; 
    x[0] = Seed & 0xffffffffUL; 
    for (ii = 0; ii < N; ii++) 
    { 
     x[ii] = (1812433253UL * (x[ii - 1]^(x[ii - 1] >> 30)) + ii); 
     x[ii] &= 0xffffffffUL; 
    } 
} 

그리고 이것은 내 랜드() 함수

unsigned long int Randomizer::Rand() 
{ 
    unsigned long int Result; 
    unsigned long int a; 
    int ii; 

    // Refill x if exhausted 
    if (Next == N) 
    { 
     Next = 0; 

     for (ii = 0; ii < N - 1; ii++) 
     { 
      Result = (x[ii] & U) | x[ii + 1] & L; 
      a = (Result & 0x1UL) ? A : 0x0UL; 
      x[ii] = x[(ii + M) % N]^(Result >> 1)^a; 
     } 

     Result = (x[N - 1] & U) | x[0] & L; 
     a = (Result & 0x1UL) ? A : 0x0UL; 
     x[N - 1] = x[M - 1]^(Result >> 1)^a; 
    } 
    Result = x[Next++]; 

    //Improves distribution 
    Result ^= (Result >> 11); 
    Result ^= (Result << 7) & 0x9d2c5680UL; 
    Result ^= (Result << 15) & 0xefc60000UL; 
    Result ^= (Result >> 18); 

    return Result; 
} 

다양한 값은 다음과 같습니다

#define A 0x9908b0dfUL 
#define U 0x80000000UL 
#define L 0x7fffffffUL 

int Randomizer::N = 624; 
int Randomizer::M = 397; 
int Randomizer::Next = 0; 
unsigned long Randomizer::x[624]; 

사람은 내가 돈을 왜 다른 씨앗내는 데 도움이 수 결과가 다른 순서로 나타 납니까?

+3

참고로 C++ 11은 메르 센 트위스터를 비롯한 몇 가지 새로운 난수 생성 기능을 정의합니다. http://en.cppreference.com/w/cpp/numeric/random – Collin

답변

5

내 종자() 함수는 부정 값 (그것은 x[-1]를 참조)와 x[0]을 덮어 ii=0에서 반복 시작 x[0]에 할당한다. 1시에 루프를 시작하면 모든 설정이 완료됩니다.

나만의 랜더 마이저 작성은 위험합니다. 왜? (위 참조) 어렵다. 올바른 일을했는지 ​​알기가 어렵고, 틀린 경우 올바르게 분배 된 난수에 의존하는 일은 제대로 작동하지 않을 것이다. 다행히 그 문제는 꼬리가 중요한 곳에서 암호 또는 통계 모델링이 아니기 때문에 .... std::random을 사용하거나 C++ 11이 아직 없다면 boost::random을 사용해보십시오.

+0

예, 그랬습니다! 감사! 이제 서로 다른 씨앗이 서로 다른 시리즈를 생산합니다. 각 씨드는 항상 똑같은 것을 생산합니다. 원래 코드를 복사하여 붙여 넣기 시작한 이래 어떻게 그 코드가 들어 왔는지 궁금합니다. – GarrickW

+0

아니요, 이건 진지한 것이 아닙니다. 그냥 취미 측 프로젝트에요. 특별한 이유가 없어도 RNG에 대해 읽었을 때 코드를 발견하고 작동시킬 수 있는지 알아보기 위해 노력할 것이라고 생각했습니다. – GarrickW

+0

나는 "* 이것으로 땜장이를 내고 무엇이 나오는 지 알아 봅시다."태도 (그리고 직접 코드를 복사하여 붙여 넣을 수도 있음)를주의 깊게 읽을 수 있지만 암호화 및 PRNG는 어두운 예술입니다. 그들은 전문가에게조차도 옳지 않고 매우 이상하고 예측할 수없는 방식으로 물지 않습니다. 그러므로 전문가가 아닌 경우 자체 암호화 알고리즘이나 PRNG를 디자인 할 이유가 없으며 기존 표준 디자인 (예 : AES 또는 L' Ecuyer/Bays-Durhman PRNG)을 "조정하여"수정해야 할 이유가 없습니다 당신이하지 않을 가능성이 압도적이기 때문에 더 좋아집니다. –