Zufallszahlen in Threads

Alles rund um die Programmierung mit Qt
Antworten
serious_sammy
Beiträge: 30
Registriert: 17. September 2013 16:07

Zufallszahlen in Threads

Beitrag von serious_sammy »

Hallo zusammen,
ich möchte via qsrand() und qrand() ein paar "Zufallszahlen" in einem Worker-Thread generieren.
Dabei habe ich fest gestellt das ein seeden im Konstruktor meiner Worker-Klasse nicht funktioniert und ich immer die gleiche Zahlenfolger erhalte. Das liegt daran das qrand() nur in der eigenen Thread-Umgebung ausgeführt wird, als seed wird immer die aktuelle Zeit benutzt (QTimer::currentTime.msec()) .

https://stackoverflow.com/questions/313 ... dom-number

Also habe ich meine seeding Methode aus dem Konstruktor genommen und nutze nun einen SingleShotTimer um die Methode einmal aufzurufen.
Leider ohne Erfolg ich erhalte immer die gleiche Zahlenfolge.


Abhilfe scheit es zu geben wenn man die Threadklasse ableitet und qsrand() in der run-Methode aufruft. Allerdings nutze ich meine Threads völlig anders, ich erstelle erst mein Workerobjekt und verschiebes es dann in denn Thread um diesen anschließend zu starten.

Hat jemand ggf. eine Idee wie man diese Problem umgehen könnte?
Vielen Dank Sammy
serious_sammy
Beiträge: 30
Registriert: 17. September 2013 16:07

Re: Zufallszahlen in Threads

Beitrag von serious_sammy »

hier noch ein paar code schnipsel:

Worker::Worker(QObject *parent) :
QObject(parent)
{
i = 0;
}

int Worker::set_seed()
{
int y = QTime::currentTime().msec();
qsrand(y);
return 0;
}

int Worker::getData()
{
int x = qrand();
return x;
}

void Worker::on_timeout()
{
//int temp = getData()%100;
int temp = i++;
int dose = getData()%100;
emit sendData(temp, dose);
//qDebug() << temp << " " << dose;
}

void Worker::on_seed()
{
set_seed();
}

###########################################

backgroundworker = new Worker();
workerThread = new QThread(this);
backgroundworker->moveToThread(workerThread);
workerThread->start();

// the timer which controls the worker to get data
QTimer::singleShot(0,backgroundworker,SLOT(on_seed()));

timer = new QTimer(this); // triggers getData every second
timer->start(1000);
Sourcerer
Beiträge: 5
Registriert: 29. August 2014 13:34

Re: Zufallszahlen in Threads

Beitrag von Sourcerer »

Hallo,

ich denke die Aufrufe von qsrand und getData passieren in unterschiedlichen Threads.

on_seed wird bei Dir über den SingleShot aufgerufen und läuft wegen der Signal-Slot Verbindung, welche standardmäßig eine QT::AutoConncection ist, in dem von dir erstellten workerThread.
Wenn du jetzt GetData explizit aufrufst läuft diese im aufrufenden Thread.
Da qsrand threadlokal arbeitet siehe: http://qt-project.org/doc/qt-5/qtglobal.html#qsrand benutzt du ein anderes seed als beim Aufruf durch SingleShot.

Gruß Sourcerer
serious_sammy
Beiträge: 30
Registriert: 17. September 2013 16:07

Re: Zufallszahlen in Threads

Beitrag von serious_sammy »

Hallo,
danke für die Antwort und sorry das ich mich jetzt erst melde.

Naja ich dachte eigentlich dadurch das ich ein Worker bzw. ein Objekt der Klasse Worker erstelle das "set_seed()" und "get_data()" im gleichen Thread ausgeführt werden, da beide Aufrufe zum gleiche Objekt gehören. Oder kann Objekt Code in zwei verschiedenen Threads ausführen?

Bis dann Sammy
Antworten