2010-06-29 10 views
4

QT 앱을 가지고있어 스레드를 2 개 더 실행하고 있습니다.qrand에서 임의의 숫자를 생성하지 않습니다.

스레드 내부에서 qrand 함수를 사용하여 난수를 생성합니다. 다음은 숫자를 가져 오는 데 사용되는 코드입니다. 여기서 m_fluctuations max는 double입니다.

int fluctuate = qrand() % (int)(m_FluctuationMax * 100); 

다음 코드를 주 스레드 및 스레드 클래스 내부에 추가하려고 시도했습니다.

QTime now = QTime::currentTime(); 
qsrand(now.msec()); 

이제 문제는 응용 프로그램이 시작될 때마다 생성되는 값이 항상 동일하다는 것입니다.

시드가 'currentTime()'에 의해 설정되기 때문에 차이가 없어야합니다.

감사

답변

8

()에 파종 할 않도록 난수가, 당 스레드 있다는 사실을


유지 스레드/클래스 생성자. run() 함수로 옮길 때 무작위로 작동하기 시작했습니다. 왜 그것이 생성자에서 작동하지 않을지 모르겠다. 도움을 주신 모든 분들께 감사드립니다.

+10

참고 사항 : qsrand()는 [스레드 로컬 저장소에 시드를 저장하기 때문에] 생성자에서 작동하지 않았습니다 (http://doc.qt.nokia.com/latest/qtglobal.html#qsrand) (각 스레드에 대해 독립적 인 값). 생성자에 호출을 넣을 때 시드는 한 스레드에서 초기화되고 다른 스레드에서 사용됩니다. 호출을'run()'메소드에 넣을 때 시드는'qrand()'를 호출하는 동일한 스레드에서 초기화됩니다. –

2

내가 확인 할하려는 것은 now.msec()의 값입니다. 현재 시간의 밀리 초 부분 만 반환하며 문서 상태는 다음과 같습니다.

정확도는 기본 운영 체제의 정확도에 따라 달라집니다. 모든 시스템이 1 밀리 초의 정확도를 제공하는 것은 아닙니다.

플랫폼에 항상 msec()에 대해 동일한 값이 반환 될 수 있습니다. 그렇다면 매분마다 코드를 여러 번 실행하지 않는다고 가정하고 몇 분에서 여러 분을 조합하여 사용해 볼 수 있습니다.

실행중인 플랫폼을 명시하지 않았지만 Qt 소스 코드가 Q_OS_WIN 또는 Q_OS_UNIX 인 경우 1 초 미만의 해상도 만 지원합니다. 당신은 아마 qsrand스레드를해야 있도록 자동으로 내 qsrand했다 1.

+0

나는 지금 검사와 밀리의 값은 어느 시간 다르지만 난수 때마다 동일합니다. –

+0

@Michael은 각 프로그램 실행시'qrand()'를 호출 할 때마다 또는 _sequence_ (각'qrand()'호출과 다른 번호) 일 때마다 _ 숫자가 동일합니까? – paxdiablo

+0

또한 m_Fluctuation_Max는 (으)로 설정되어 있습니까? 그리고 항상 같은 번호를 얻는다면 무엇입니까? – paxdiablo

2

스레드/클래스 생성자에서 qsrand()를 사용했습니다. run() 함수로 옮길 때 무작위로 작동하기 시작했습니다. 왜 그것이 생성자에서 작동하지 않을지 모르겠다.

qsrand() 실제로 qrand() 또한 각 호출에 업데이트되는 의사 난수 생성기 상태 시드를 저장하기 위해 스레드 로컬 저장소를 사용한다. 당신이 그것을 사용할 스레드 외부에 PRNG를 뿌리면 그 씨앗은 결과에 영향을 미치지 않습니다. 기본적으로 스레드 로컬 저장소는 기본값이 0이므로 시드가 항상 동일하기 때문에 매번 동일한 가성 시퀀스를 얻을 수 있습니다.이 비슷한 문제가 일어난 사람을 도움이 될 수

3

:

qsrand(static_cast<quint64>(QTime::currentTime().msecsSinceStartOfDay())); 

array<int, 5> arr = {qrand(), qrand(), qrand(), qrand(), qrand()}; 

for(auto i : arr) 
    cout << i << endl; 
관련 문제