在 C 中使用 drand48_r 作为随机数生成器

pfd*_*ers 2 c random macos gnu openmp

所以我一直在用 C 编写一些应用程序并使用 OpenMP 进行并行化。我实现了 Monte-Carlo Pi 估计,发现正常的 rand() 函数不是可重入和线程安全的。建议使用 drand48_r 选项。

现在问题来了,我的应用程序在 Linux 上编译得很好,例如。Ubuntu、Fedora 和 CentOS 但不能在 Mac OS X 上编译。 OS X 上的编译错误是。

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;
}
Run Code Online (Sandbox Code Playgroud)

我阅读了它,并在手册页中找到了一条说明,

这些函数是 GNU 扩展,不可移植。

这是它的链接:http : //www.kernel.org/doc/man-pages/online/pages/man3/drand48_r.3.html

所以我有很多问题;

  1. 什么是 GNU 扩展以及是什么使它不可移植?
  2. 在也是线程安全的 OS X 上生成随机数有哪些替代方法?

嗯,就是这样。

该示例使用 gcc 编译为,

gcc simple.c -o simple

Jen*_*edt 5

我真的没有看到使用drand48_rover的好处erand48erand48具有相同类型的随机生成器,drand48但与接收随机生成器的状态作为函数参数相比,它完美地完成了这项工作。

_r延伸部将结果存储在适当位置(第二个参数),并返回总是保证是一个错误代码0。我看不出这有多大用处。我会坚持使用 POSIX 接口(特别是erand48)。