所以我一直在用 C 编写一些应用程序并使用 OpenMP 进行并行化。我实现了 Monte-Carlo Pi 估计,发现普通的 rand() 函数不是可重入的和线程安全的。建议使用 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.
这是一个链接:http://www.kernel.org/doc/man-pages/online/pages/man3/drand48_r.3.html
所以我有很多问题;
- 什么是 GNU 扩展,是什么让它不可移植?
- 在线程安全的 OS X 上,我有哪些替代方法可以生成随机数?
嗯,就是这样。
例子是用gcc编译的,
gcc simple.c -o simple
最佳答案
我并没有真正看到使用 drand48_r
而不是 erand48
的好处。 erand48
具有与 drand48
相同类型的随机生成器,但相比之下,它接收随机生成器的状态作为函数参数,因此它完美地完成了这项工作。
_r
扩展将结果存储在适当的位置(第二个参数)并返回始终保证为 0
的错误代码。我看不出这一切有多大用处。我会坚持使用 POSIX 接口(interface)(特别是 erand48
)。
关于c - 在 C 中使用 drand48_r 作为随机数生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10014981/