2016-11-01 3 views
0

私はUbuntu 10.04.5 LTSでZMQ 4.1.2を使用しています。ZMQ C++がrand()を呼び出さないようにする

私は、srand()を固定数でシードし、次にrand()〜100k回呼び出して存在するC++プログラムを持っています。私は、同じプログラムを2度再実行すると、違う乱数を得ていることが分かりました。

100kの描画を開始する前にZMQソケットを開いていれば、ZMQライブラリ自体がrand()を呼び出していて、再現性を乱しているようです。

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

私がやらなければならないことは、socket->(接続)とランド(への私の呼び出し)決定論的に振る舞う呼び出し省略です。

これはZMQのバグ(機能)ですか?または、これは基礎となるTCPソケットでも起こりますか?

答えて

2

randの代わりにrand_rを使用して、使用法がrandを使用する他のライブラリと競合しないようにします。例:

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

感謝。これを行うために私のコードを変更することはできますが、ZMQライブラリもrand_rを使用すべきではありませんか? – portforwardpodcast

+0

誰もがrand_rを使用する必要があります。 :) – selbie

+0

多くのシステムではひどいバイアスや制限された出力範囲と徹底的に枯渇しやすいシード状態を表示するため、本当に誰も 'rand'や' rand_r'を何に使うべきではありません。しかし、ええ、あなたが1つを使用しなければならない場合、 'rand_r'はより安全です。 – ShadowRanger

関連する問題