私はC言語でいくつかのアプリケーションを書いており、並列化のためにOpenMPを使っています。私はMonte-Carlo Pi推定を実装し、通常のrand()関数はリエントレントでスレッドセーフではないことを発見しました。 drand48_rオプションを使用することをお勧めします。C言語の乱数生成器としてdrand48_rを使用
ここに問題があります。私のアプリケーションはLinux上で正常にコンパイルされます。 Ubuntu、Fedora、CentOSなどがありますが、Mac OS Xではコンパイルされません。OS Xでのコンパイルエラーです。
simple.c:7: error: storage size of ‘randBuffer’ isn’t known
簡単な例として使用されるコードは次のとおりです。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[]) {
double x;
struct drand48_data randBuffer;
srand48_r(time(NULL), &randBuffer);
drand48_r(&randBuffer, &x);
printf("Random number: %f\n", x);
return EXIT_SUCCESS;
}
私はそれについてまで読んで、私はここで
These functions are GNU extensions and are not portable.
がリンクであること、manページにノートを見つけましたそれには:http://www.kernel.org/doc/man-pages/online/pages/man3/drand48_r.3.html
私は多くの質問があります。
- GNU拡張とは何ですか?また、移植性を損なうものは何ですか?
- スレッドセーフでもあるOS Xの乱数生成にはどのような選択肢がありますか?
それはそれについてです。
例は
gcc simple.c -o simple
あなたのランダムシードとして 'time()'を使うことはあまりランダムではないことに注意してください。これはアプリケーションにとって重要ではないかもしれませんが、2つのプロセスが同じ秒で実行される場合、同じシード(時間)を使用するため、乱数の同じシーケンスが得られます。 –
ええ、私は通常、SEEDの値をスレッドのIDと組み合わせます。この例では、わかりやすくするためにOpenMPコードを省略しました。 – pfdevilliers