【问题标题】:How are random numbers generated in C (rand function)? [duplicate]C(rand函数)中如何生成随机数? [复制]
【发布时间】:2021-05-13 13:11:21
【问题描述】:

C 中生成随机数的经典方法是:

srand(time(NULL));
int rand = rand();

我想知道伪随机数生成背后的算法。 rand() 函数是如何工作的?

rand() behaves differently between macOS and Linux 没有回答我的问题。它只回答了rand() 的实现可能因系统而异的事实。我正在寻找它的一般实施方式或一般实施类别。

【问题讨论】:

标签: c random


【解决方案1】:

C 中的rand() 通常实现为Linear Congruential Generator (LCG),但有很多random number generators

即使它是生成随机数的经典方式,rand() 也有其局限性,我建议在其他线程中解决它的缺陷 Why is the use of rand() considered bad?

根据您的用例,您可能希望使用其他随机数生成方法。

【讨论】:

    【解决方案2】:

    rand()stdlib.h 中定义,其实现取决于您使用的libc。这样,它不仅依赖于操作系统。

    glibc 看这里: glibc:rand.c > random.c > glibc:random_r.c

    ulibc 更容易阅读,这里:rand.c > random.c > rand_r.c

    FreeBSD libc 在这里:rand.c > random.c

    dietlibc:rand.c > rand_r.c

    请注意,这些库都没有从/dev/[u]random 读取数据,并且实现更易于阅读和理解。要开始研究这个兔子洞,来自 linux 内核的 char/random.c 是一个很好的起点,它的功能可能类似于 arch_get_random_long

    【讨论】:

      猜你喜欢
      • 2015-09-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-19
      相关资源
      最近更新 更多