そのため、私はCでいくつかのアプリケーションを作成し、並列化にOpenMPを使用しています。モンテカルロ円周率推定を実装したところ、通常のrand()関数は再入可能でスレッドセーフではないことがわかりました。drand48_rオプションを使用することをお勧めします。
ここに問題があります。私のアプリケーションはLinuxで正常にコンパイルされます。Ubuntu、Fedora、CentOSですが、MacOSXではコンパイルされません。OSXでのコンパイルエラーはです。
simple.c:7:エラー:「randBuffer」のストレージサイズが不明です
簡単な例として使用されるコードは次のとおりです。
#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;
}
それについて読んだところ、manページに次のようなメモが見つかりました。
これらの関数はGNU拡張機能であり、移植性はありません。
これへのリンクは次のとおりです:http ://www.kernel.org/doc/man-pages/online/pages/man3/drand48_r.3.html
ですから、いくつか質問があります。
- GNU拡張機能とは何ですか?また、移植性がない理由は何ですか?
- スレッドセーフでもあるOSXでの乱数生成にはどのような選択肢がありますか?
さて、それはそれについてです。
この例は、gccを使用してコンパイルされています。
gcc simple.c -o simple