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

标签 c macos random openmp gnu

所以我一直在用 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

所以我有很多问题;

  1. 什么是 GNU 扩展,是什么让它不可移植?
  2. 在线程安全的 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/

相关文章:

java - 如何为所有按钮设置不同的随机数?

macos - 奇怪的行为 NSBitmapImageRep

java - Sceneform ARCore 加载并构建随机 3D 资源

c - 8 字节有符号值到 4 字节值(长)

c - STM32人工智能

objective-c - setAcceptsTouchEvents 仅在触控板上的手势后才能正常工作

macos - 是否有任何信息图表支持每个 OS X 的 SSL/TLS 版本?

c - 如何将随机生成的字符添加到 C 中的字符串中?

c - 使用 realloc 后,数组中的下一个指针丢失

c - 在函数中调用时,数组被修改而不是 int