【问题标题】:Random numbers in POSIX C APIPOSIX C API 中的随机数
【发布时间】:2011-01-31 11:44:37
【问题描述】:

我希望在 POSIX 系统上生成大的非负整数随机值。我找到了 2 个符合要求的可能函数,以及它们各自的初始化程序:

       #include <stdlib.h>

       long int random(void);    
       void srandom(unsigned int seed);
CONFORMING TO
       4.3BSD, POSIX.1-2001.

       // and

       long int lrand48(void);
       void srand48(long int seedval);    
CONFORMING TO
       SVr4, POSIX.1-2001.
  1. 首选哪些函数(线程安全和生成的值范围)?
  2. 鉴于安全不是问题,我应该如何为它们播种?
  3. 播种方法是否应该因播种函数的不同参数而不同(long intunsigned int)?

【问题讨论】:

  • 如果您使用的是 POSIX 系统,您也可以使用 /dev/urandom/dev/random

标签: c linux random posix srand


【解决方案1】:

使用nrand48,它与lrand48 具有相同的范围,并接收一个指向用作种子的数组的指针。将此线程设为本地将确保线程安全。 (附带说明一下,glibc 实现可能存在一些问题,请参阅http://evanjones.ca/random-thread-safe.html 了解更多信息,此页面还包含线程安全随机数生成函数的精彩摘要)

【讨论】:

  • +1 用于指向nrand48 及其潜在问题的旁注
  • 你能解释一下为什么nrand48random更好吗?
  • AFAICT, random 本质上不是线程安全的(glibc 实现是,因为它锁定了它的内部状态,但并非所有 POSIX 实现都如此)。 glibc 提供了random_r,它是线程安全的,但不可移植。 nrand48 唯一做得更好的是线程安全,允许您获得独立的随机数流。范围相似(random2^31 - 1nrand482^31),random 的周期可能更长。底线,恕我直言,如果您需要线程安全,请使用nrand48,否则使用random
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-08
  • 2011-01-27
  • 2011-11-07
  • 1970-01-01
  • 1970-01-01
  • 2014-04-27
  • 2018-11-19
相关资源
最近更新 更多