所以我一直在使用C編寫一些應用程序並使用OpenMP進行並行化。我實現了Monte-Carlo Pi估計,發現正常的rand()函數並不是重要的,並且是線程安全的。建議使用drand48_r選項。使用drand48_r作爲C中的隨機數生成器
現在,這裏是問題,我的應用程序編譯罰款在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.
這裏是一個鏈接它:http://www.kernel.org/doc/man-pages/online/pages/man3/drand48_r.3.html
所以我有一些問題;
- 什麼是GNU擴展和什麼使它不可移植?
- 我還有什麼替代方案可以在OS X上進行隨機數生成,這也是線程安全的?
就是這樣。
的例子是用gcc編譯的,
gcc simple.c -o simple
請注意,使用'time()'作爲隨機種子不是非常隨機的。這對您的應用程序可能無關緊要,但至少要注意如果兩個進程在同一秒運行,他們將得到相同的隨機數序列,因爲它們使用相同的種子(時間)。 – 2012-04-04 19:47:22
是的,我通常將SEED值與一個線程的ID結合在一起。在這個例子中,爲了簡單起見,我省略了OpenMP代碼。 – pfdevilliers 2012-04-06 09:46:10