2015-01-17 8 views
1

C++ 11의 prng 기능을 사용하는 라이브러리를 작성한다고 가정 해 보겠습니다. 라이브러리의 각 함수/객체/파일은 자체 난수 생성기를 초기화해야합니까? 네임 스페이스에 하나의 정적 std :: mt19937을 초기화하고 그 중 하나만 사용하면 코드는 모듈성이 떨어질 것입니다. 권장 사항입니까?모범 사례/라이브러리의 난수 생성기 사용법에 대한 숙어

+0

당신은 싱글 톤을 사용할 수 있습니다. 그렇게하면 모듈성을 보존하고 생성자를 하나만 사용할 수 있습니다. 그것이 실제로 어떻게 행동할지 모르겠다. 그냥 생각. – bolov

+0

그것은 정말로 당신이 성취하고자하는 것에 달려 있습니다. 예를 들어, 응용 프로그램에서 이전 실행에서 시드를 제공하고 동일한 결과를 얻는 것이 필요하면 단일 소스가 적합하다고 보입니다. 어떤 문제라도 해결할 수있는 옵션이 없다면 적절할 수 있습니다. –

+1

구현에 따라, mt19937과 같은 prng는 생각보다 커질 수 있습니다. dinkum의 32 비트 MS 버전은 5K 이상입니다. 그건별로 좋아 보이지 않을 지 모르지만, 5 만개의 물건을 가지고있을 때 합쳐집니다. 각각의 물건은 1 인당 경로 당일에 약 1 개를 선전합니다. (주어진 예제는 단지 prng에서 약 244 ** MB **입니다). – WhozCraig

답변

2

스레드로부터 안전하지 않으므로 다중 스레드를 생성하려면 MT19937 prng의 인스턴스를 더 만드십시오. 그렇지 않으면 전적으로 당신에게 달린 것입니다. 그 이상의 모든 대답은 주로 의견을 기반으로 할 것입니다.

메모리가 부족하지 않은 경우 응용 프로그램의 prng 인스턴스 수가 너무 적어 지도록 최적화해야하는 이유는 무엇입니까? 간단한 대답 : 프로그램 작성, 디버그 및 관리가 가장 쉬운 방법을 만드십시오.

가능한 해결책은 각 개체의 MT19937에 대한 참조를 유지하고 스레드로부터 안전한 것으로 만들기 위해 잠금 구성을 통해 액세스를 제어하는 ​​것입니다.

+0

의미가 있습니다. MT19937 인스턴스를 초기화하는 비용은 얼마나 들까 요? – UXkQEZ7

+0

구현에 따라 달라질 수 있습니다. 솔직히 나는 Visual Studio에 포함 된 버전이 얼마나 큰 버전인지 알지 못합니다. 나는 그것을 프로파일 링해야 할 것입니다. MT19937은 19937 비트의 상태이므로 순진한 추측을하기 위해서는 단순히 상태 (19937/8 = 2492.125)를 유지하기 위해 최소 2.5KB의 메모리를 사용한다고 가정합니다. – dodexahedron