시드와 임의 값 범위로 제어하는 난수를 생성하기 위해 클래스를 캡슐화하려고합니다. 코드의 다른 부분에서 범위가 다르지만 동일한 시드를 사용하여이 클래스를 호출하고 싶습니다.
다른 게시물 ( boost를 사용하는 C ++-11의 캡슐화 된 난수 생성기)의 제안에 따라 다음 코드를 구현했습니다.
내 난수 생성기 클래스 :
#include <random>
#include <iostream>
typedef std::mt19937 ENG; // Mersenne Twister
typedef std::uniform_int_distribution<> iDIST; // Uniform Integer Distribution
class RNG {
private:
ENG eng;
iDIST idist;
public:
iDIST::result_type igen() { return idist(eng); }
RNG(ENG eng_,int imin,int imax)
: idist(imin,imax)
{eng = eng_; }
};
RNG 클래스의 객체를 생성하고 임의의 값을 인쇄하는 함수 :
void myfunc(ENG eng_,int imin, int imax, int N){
RNG myirn(eng_,imin,imax);
for (int i = 0; i < N; i++){
std::cout << myirn.igen() << std::endl;
}
return;
}
내 주요 기능 :
int main(int argc, char **argv){
int myseed = 1;
int N = 5;
int imin1 = 1;
int imax1 = 10;
//Seed globally
ENG eng_;
eng_.seed(myseed);
std::cout << "Range = [" << imin1 << "," << imax1 << "]" << std::endl;
myfunc(eng_,imin1,imax1,N);
std::cout << "Range = [" << imin1 << "," << imax1 << "]" << std::endl;
myfunc(eng_,imin1,imax1,N);
return 0;
}
보시다시피, 내 전략은 내 난수 생성기를 전역으로 (주 함수에서) 시드하고 변수 eng_을 함수 func에 매개 변수로 전달하여 RNG 개체를 인스턴스화하고 임의 값을 인쇄하는 것이 었습니다. 모든 것이 올바르다면,이 코드는 동일한 범위 내에서 다른 값으로 5 개의 난수로 구성된 2 개의 시퀀스를 인쇄해야합니다. 그러나 그들은 정확히 같은 순서입니다. 누구든지이 문제를 해결하도록 도울 수 있습니까?
같은 엔진을 사용하려면 같은 엔진을 사용해야합니다. (그 정도는 싱글 톤입니다.) RNG에 대한 참조를 전달하고 RNG 내에서 참조를 저장하고 사용합니다. 코드를 약간 변경하면 이렇게됩니다 (이미 지적한 주석 중 하나).
ENG ŋ
RNG(ENG &eng_, int imin, int imax)
: idist(imin, imax), eng(eng_) {}
void myfunc(ENG &eng_, int imin, int imax, int N)
그러나 엔진이 다음과 같이 RNG에 숨겨져 있으면 더 좋습니다.
class RNG {
private:
static ENG eng;
iDIST idist;
public:
static void seed(int s) { eng.seed(s); }
RNG(int imin, int imax) : idist(imin, imax) {}
int generate() { return idist(eng); }
};
// the one generator, stored as RNG::eng
ENG RNG::eng;
// print some generated numbers from a range
void printRandomNumbers(int imin, int imax, int N){
std::cout << "Range = [" << imin << "," << imax << "]" << std::endl;
RNG myirn(imin, imax);
for (int i = 0; i < N; i++){
std::cout << myirn.generate() << std::endl;
}
return;
}
int main()
{
//Seed globally
int myseed = 1;
RNG::seed(myseed);
printRandomNumbers(1, 10, 5);
printRandomNumbers(11, 20, 5);
printRandomNumbers(21, 30, 5);
return 0;
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다