POSIX C API中的随机数

Mat*_*ner 5 c linux random posix srand

我想在POSIX系统上生成大的非负整数随机值.我找到了两个适合账单的功能,以及它们各自的初始化器:

       #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.
Run Code Online (Sandbox Code Playgroud)
  1. 哪些函数是首选的(线程安全性和生成的值范围)?
  2. 鉴于安全性不是问题,我应该如何种下它们?
  3. 由于播种功能的不同论点(long int相对unsigned int),播种方法是否会有所不同?

Has*_*kun 4

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

  • AFAICT,“random”本质上不是线程安全的(glibc 实现是线程安全的,因为它锁定其内部状态,但并非所有 POSIX 实现都是如此)。glibc 提供了“random_r”,它是线程安全的,但不可移植。`nrand48` 唯一做得更好的是线程安全,允许您获得独立的随机数流。范围相似(“random”为“2^31 - 1”,“nrand48”为“2^31”),“random”的周期可能更长。恕我直言,如果您需要线程安全,则底线是使用“nrand48”,否则使用“随机”。 (2认同)