2017-12-09 3 views
0

저는 원자 객체에 대한 간단한 클래스를 작성하고 있습니다. 여기에 내가 지금까지 쓴 내용은 다음과 같습니다기본 생성자가 무작위 값을 설정합니다.

#include <random> 

class Atom { 
    int mSpin; 

public: 
    Atom(); 
    Atom(int); 
    Atom(const Atom&); 
    ~Atom() {} 

    Atom& operator= (const Atom &atom); 
}; 

그리고 .cpp 파일 :

include "Atom.h" 

Atom::Atom() { 
} 
Atom::Atom(int spin) : mSpin(spin) {} 
Atom::Atom(const Atom& copy) : mSpin(copy.mSpin) {} 

/* OPERATORS */ 

Atom& Atom::operator= (const Atom &copy) { 
    mSpin = copy.mSpin; 
    return *this; 
} 

내가 기본 생성자를 만들고 싶어 그런 내가 객체를 생성하고있을 때, mSpin 무작위로 될 것 1 또는 -1로 설정하십시오. 나는 rand()로 그것을하는 방법을 이해하지만 rand()는 그리 좋지 않고 사용하고 싶다. 나는이 문서의 사용과 다른 대답에 대해서도 혼란스러워합니다. 보통 내가 이런 걸 할 거라고 :

#include <random> 
std::random_device rd; 
std::mt19937 gen(rd()); 
std::uniform_int_distribution<> dis(0,1); 
int random_number = dis(gen); 

을하지만 클래스 내에 사용하는 방법을 모르겠어요. 나는 그것을 기본 생성자 안에 넣으려고했으나 원자를 만들 때마다 그것이 시드되기 때문에 잘못되었다고 생각하니?

희망 사항은 분명합니다.

답변

0

Atom 클래스의 임의의 장치 및 생성기 정적 멤버를 만들어야합니다. 이렇게하면 전역 변수와 마찬가지로 프로그램 기간 동안 단 한번 초기화됩니다.

class Atom { 
    // declaration 
    static std::random_device rd; 
    static std::mt13397 gen; 

    ... 
}; 

// definition - this must be in Atom.cpp 
std::random_device Atom::rd; 
std::mt13397 Atom::gen(Atom::rd()); 
+0

정말 고마워요! 나는 당신의 대답을 투표 할 것이지만 그것을하기에 충분한 명성이 없습니다. – Lilith

+0

문제가 없습니다. 그러나 당신이 질문을 올린 사람이기 때문에 그것을 당신이 인정하는 대답으로 표시 할 수 있습니다. 그건 그렇고, 당신의 이싱 모델들에게 행운을 빈다. –

+0

이제 승인 된 답변입니까? 나는 그렇게 희망한다! Ising 모델에 대한 것이 너무 명백 했습니까? : D – Lilith

0

당신은 CPP 파일에있는 함수에 위임 할 수

namespace {                                     
    random_device rd;                                    
    mt19937 gen(rd());                                   
    uniform_int_distribution<> dis(0,1);                                                                     
}                                        
int spin() {                                                                            
    return dis(gen) == 0 ? -1 : 1;                               
}                                        

기본 ctor에의 구현을 삭제합니다. 당신의 CPP 파일에서 익명에서 당신의 아톰 기본 ctor에 구현과 이동 '스핀'기능 정의를 삭제,

int spin(); // Return -1 or 1, randomly 

class Atom { 
    int mSpin = spin(); 
public: 
    Atom() = default; 
    ... 
}; 

다음 :

그리고 규칙을 따르도록 변화 Atom.hpp '모든 변수 초기화' 네임 스페이스.

+0

답변 해 주셔서 감사합니다.하지만 쉽게 찾을 수 있기 때문에 다른 하나를 사용하게 될 것입니다. 내가 upvote (충분한 명성을 가지고 있지 않다) 전에는 몰랐던 삼항 연산자. – Lilith

관련 문제