2013-04-09 2 views
5

주어진 간격으로 임의의 정수를 생성하기 위해 다음 클래스를 작성했습니다 : [lower, upper].변화하는 간격에서 의사 랜덤 정수를 효율적으로 생성하기

class RandomInteger { 

protected: 

    std::random_device randomDevice; 
    std::default_random_engine randomEngine; 
    std::uniform_int_distribution<> distribution; 

public: 

    RandomInteger(int64_t lower, int64_t upper); 

    virtual ~RandomInteger(); 

    virtual int64_t generate(); 
}; 


RandomInteger::RandomInteger(int64_t lower, int64_t upper) : randomEngine(this->randomDevice()), distribution(lower, upper) { 
} 

RandomInteger::~RandomInteger() { 
    // TODO Auto-generated destructor stub 
} 

int64_t RandomInteger::generate() { 
    int64_t i = this->distribution(this->randomEngine); 
    return i; 
} 

간격이 만들어 generate 동일한 여러 통화를 남아있는 경우이 괜찮습니다. 그러나 이제는 유스 케이스가 항상 변경되는 간격에서 정수를 생성합니다 (상한은 매번 증가합니다).

우선 무엇보다 빠른 속도 여야합니다. 이것은 암호화와 아무런 상관이 없으므로 의사 난수 값은 매우 좋으며 (std::random_device은 아마도 필요하지 않습니다). 가능하다면 C 스타일을 피하고 현대적인 C++ 11 스타일을 사용하고 싶습니다.

이렇게 효과적으로 할 수있는 방법을 제안 할 수 있습니까?

+2

배포가 충분히 효율적이지 않습니까? 'uniform_int_distribution'은 매우 얇은 래퍼입니다. 상당한 오버 헤드가 없어야합니다. 또한 클래스의 함수가 왜 '가상'입니까? –

+0

@KonradRudolph 그들은 가상 일 필요가 없습니다. 그 (것)들을 nonvirtual 결과 여기 뜻 깊은 speedup에 만들 것입니다? 나는 가상 메소드 호출에 대한 오버 헤드가 매우 낮다는 것을 배웠다. 그것은 이상한 상황입니다. C++은 OOP 언어라고 주장합니다. OOP는 미래에 코드를 확장하고 재사용 할 수 있도록 만드는 것에 관한 것입니다. 그러나 많은 C++ 프로그래머는 현재 명시 적으로 필요하지 않으면 다른 사람들에게 OOP를 사용 중지하도록 (즉, 가상이 아닌 메소드를 작성하도록) 조언합니다. – clstaudt

+0

@KonradRudolph "배포판 변경"은 다른 매개 변수로 새로운'std :: uniform_int_distribution'을 인스턴스화하는 것을 의미할까요? – clstaudt

답변

2

사용 허용 uniform_int_distribution::operator()의 과부하 const param_type & :.

int64_t RandomInteger::generate(int64_t lower, int64_t upper) { 
    int64_t i = this->distribution(this->randomEngine, 
     std::uniform_int_distribution<int64_t>{lower, upper}.param()); 
    return i; 
} 

(당신이 param 설정에 관심이없는 등, distribution 가치를 초기화해야합니다 또한, distributionint64_t와 템플릿한다, int가 아님)

uniform_int_distribution이 상태를 보존하면 효율적으로 사용합니다.

사실 실제로 uniform_int_distribution의 대부분의 구현은 상태를 유지하지 않습니다. 예를 들어 libstdC++ random.tcc : http://gcc.gnu.org/onlinedocs/gcc-4.6.0/libstdc++/api/a01001_source.html#l00832

관련 문제