2016-11-01 4 views
0

Ich benutze ZMQ 4.1.2 auf Ubuntu 10.04.5 LTS.Verhindern ZMQ C++ von rufenden Rand()

Ich habe ein C++ - Programm, das srand() mit einer festen Nummer, und dann ruft Rand() ~ 100k mal und existiert. Ich stellte fest, dass ich verschiedene Zufallszahlen erhielt, wenn ich das gleiche Programm zweimal wiederholte.

Wenn ich einen ZMQ-Sockel geöffnet habe, bevor ich meine 100k Draws starte, scheint es, als ob die ZMQ-Bibliothek rand() aufruft und meine Wiederholbarkeit durcheinander bringt.

this->context = new zmq::context_t(1); 
this->socket = new zmq::socket_t(*this->context, ZMQ_PUB); 
socket->connect("tcp://localhost:5556"); // offending line 

Alles, was ich tun müssen, ruft socket- auslassen> connect() und meine Anrufe rand() verhalten sich deterministisch.

Ist dies ein Fehler (Feature) in ZMQ? Oder geschieht dies auch mit dem zugrunde liegenden TCP-Socket?

Antwort

2

Sie möchten rand_r anstelle von rand verwenden, damit Ihre Verwendung nicht mit anderen Bibliotheken kollidiert, die rand verwenden. z.B.

unsigned int seed = YOUR_INITIAL_SEED; 

for (int x = 0; x < 100000; x++) 
{ 
    unsigned int r = rand_r(&seed); 
    DoMyThing(r); 
} 

https://linux.die.net/man/3/rand

+0

Dank. Ich kann meinen Code ändern, um dies zu tun, aber sollte die ZMQ-Bibliothek nicht auch rand_r verwenden? – portforwardpodcast

+0

Jeder sollte rand_r verwenden. :) – selbie

+0

Wirklich, niemand sollte 'rand' oder' rand_r' für irgendetwas verwenden, weil sie auf vielen Systemen schreckliche Vorurteile und/oder begrenzte Ausgabebereiche und trivial erschöpfbare Seed States aufweisen. Aber ja, wenn du einen verwenden musst, ist "rand_r" "sicherer". – ShadowRanger