【问题标题】:c - random number generatorc - 随机数生成器
【发布时间】:2011-01-24 16:35:56
【问题描述】:

如何生成一个介于 0 和 1 之间的随机数?

【问题讨论】:

标签: c random


【解决方案1】:

您可以使用stdlib.h 生成一个伪随机数。只需包含 stdlib,然后调用

double random_number = rand() / (double)RAND_MAX;

【讨论】:

  • 作为参考,这将给出 [0.0, 1.0] 中的值,即包括 0.0 和 1.0。
  • 最重要的是,这很可能不公平(!)有许多实现,其中集合 [0.0, 1.0] 包含超过 RAND_MAX 元素。 (在 C 中,集合 [0.0, 1.0] 是可数有限集
  • @MSalters,这是一个有趣的问题,有什么解决方案的想法吗?
  • 这真的取决于应用程序。首先要意识到集合[0.00, 0.01] 包含的元素比集合[0.99, 1.00] 多得多。这是因为1E-100 > 01 - 1E-100 == 1。对于许多应用程序,这可以通过设置p(x) = 1.0/(_nextafter(x)-x); 来抵消,尽管这在技术上适用于[0.0, 1.0) 范围。结果是p(x)依赖于x,但是SUM[0<=i<x](p(i)) == x
  • 哦,通常这并不重要 - 许多应用程序即使使用double arr[11] = {0.0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0 }; return arr[rand % 11];也可以工作
【解决方案2】:

假设 OP 想要 0 或 1:

srand(time(NULL));
foo = rand() & 1;

受评论启发编辑: 旧的rand() 实现有一个缺陷——低阶位的周期比高阶位短得多,因此在这种实现中使用低阶位并不好。 如果您知道您的 rand() 实现存在此缺陷,请使用高位位,如下所示:

foo = rand() >> (sizeof(int)*8-1)

假设常规的每字节 8 位架构

【讨论】:

  • 你应该改变rand()的结果来解决线性同余生成器的问题
  • @Christoph 谢谢你,我已经编辑了我的帖子以反映你的观点。
  • 谁说rand() 使用全部 32 位? MSVC 上的RAND_MAX 是 0x7fff,例如 (msdn.microsoft.com/en-us/library/2dfe3bzd%28VS.80%29.aspx)。
  • 如果你使用rand() >> (sizeof(int)*CHAR_BIT-1),你不必假设每字节8位。
  • @MSalters:rand() / (RAND_MAX + 1) 不会总是得到 0 吗?
【解决方案3】:

man 3 drand48 正是您要求的。

drand48()erand48() 函数返回非负双精度浮点值,均匀分布在区间 [0.0 , 1.0] .

这些可以在 UNIX 平台上的 #include <stdlib.h> 中找到。但是,它们不在 ANSI C 中,因此(例如)您不会在 Windows 上找到它们,除非您带来自己的实现(例如 LibGW32C)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-24
    • 1970-01-01
    • 2016-08-15
    • 2017-04-10
    • 1970-01-01
    相关资源
    最近更新 更多