메르 센 트위스터를 사용하는 사용자 정의 랜더 마이저 클래스가 있습니다. 사용하는 코드는 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];
사람은 내가 돈을 왜 다른 씨앗내는 데 도움이 수 결과가 다른 순서로 나타 납니까?
참고로 C++ 11은 메르 센 트위스터를 비롯한 몇 가지 새로운 난수 생성 기능을 정의합니다. http://en.cppreference.com/w/cpp/numeric/random – Collin