【问题标题】:How to generate a random number between 0 and 1?如何生成0到1之间的随机数?
【发布时间】:2011-06-02 18:04:05
【问题描述】:

我想生成 (0,1) 之间的随机数。我正在尝试以下方法:

double r2()
{
    return((rand() % 10000) / 10000.0);
}

int SA()
{
    double u;
    u = r2();
}

但它不会产生预期的结果。我该如何解决?

【问题讨论】:

  • 定义“不正确的结果”你可能会得到更好的回应。
  • 顺便说一句。 SA() 不返回任何内容。
  • 我没有给出所有代码..这是出了问题的部分。
  • 您的代码对我来说很好用(在让 SA 返回某些内容之后)。
  • 您如何检查u 不是“正确结果”?

标签: c


【解决方案1】:

在您的版本中,rand() % 10000 将产生一个介于 09999 之间的整数。由于 RAND_MAX 可能只有 32767,并且由于它不能完全被 10000 整除,并且相对于 10000 而言并不大,因此结果的“随机性”会有很大偏差,而且最大值将是 0.9999,而不是 1.0 ,并且您不必要地将值限制为小数点后四位。

这是一个简单的算术,一个随机数除以最大可能的随机数将得到一个从 0 到 1 的数字,同时利用 RNG 的完整分辨率和分布

double r2()
{
    return (double)rand() / (double)RAND_MAX ;
}

如果有意排除 1.0,请使用 (double)rand() / (double)((unsigned)RAND_MAX + 1)

【讨论】:

【解决方案2】:
double r2()
{
   return (rand() % 10001) / 10000.0;
}

【讨论】:

    【解决方案3】:

    您是否尝试过:将 ((rand() % 10000) / 10000.0) 替换为:(rand() % 2)。这对我有用!

    所以你可以这样做:

    double r2()
    {
         srand(time(NULL));
         return(rand() % 2);
    }
    

    【讨论】:

      【解决方案4】:

      以下是在指定范围内生成随机数的一般过程:

      int randInRange(int min, int max)
      {
        return min + (int) (rand() / (double) (RAND_MAX + 1) * (max - min + 1));
      }
      

      根据所使用的 PRNG 算法,% 运算符可能会导致非常-随机的数字序列。

      【讨论】:

      • 如果问题的范围是0到1,这个函数每次都会返回零。它也许应该返回一个双倍。如果需要非整数范围怎么办?无论哪种方式,这对于原始要求都有些过分了。
      • @Clifford 这将如何每次返回 0? (max-min+1)2,这意味着 rand() 位将返回一个数字 [0-2),当用 (int) 截断时,应该以相等的概率滚动 01
      • 用了三年时间才引起大家的注意,竟然还投了票!我一定被所有的括号弄糊涂了。然而,最初的问题意味着需要一个在 0 到 1 范围内的 double,这将返回一个 intRAND_MAX + 1 也可能溢出。
      • 如果需要这个函数,那么可以使用 Clifford 函数实现:return min+(int)(r2()*(max-min+1));
      • RAND_MAX + 1 可以很容易地成为 INT_MIN 或 UB。建议(RAND_MAX/2 + 1)*2.0
      【解决方案5】:

      在我看来,您没有先调用 srand。 用法示例here

      【讨论】:

      • 这可能无关紧要,并且在某些情况下是不可取的(例如,如果您想要可重复的测试),而且这显然只是一个片段,并不是他问题的原因。
      【解决方案6】:

      使用srand() 设置种子。此外,您没有在rand() 中指定最大值,因此它使用RAND_MAX。我不确定它是否实际上是 10000 ......为什么不直接指定它。虽然,我们不知道您的“预期结果”是什么。它是一个随机数生成器。你期待什么,你看到了什么?

      正如另一条评论所述,SA() 没有明确返回任何内容。

      http://pubs.opengroup.org/onlinepubs/009695399/functions/rand.html http://www.thinkage.ca/english/gcos/expl/c/lib/rand.html

      来自Generating random number between [-1, 1] in C? ((float)rand())/RAND_MAX 在 [0,1] 中返回一个浮点数

      【讨论】:

      • 我用过 srand(time(NULL));我得到的结果是例如7.8。我想要 (0,1) 之间的数字。
      • 是的...我们知道您想要 (0,1),它在问题/描述中出现了两次。我们怎么知道你使用了 srand()?将最大值指定给 rand() 怎么样?您还说您“显然”使用了 printf。如果您只给我们一些代码,这对我们来说有多明显?帮助我们帮助您。
      • 如何指定 rand() 的最大值?你不必是我在没有 srand() 的情况下使用它的意思,我得到了相同的结果。
      • 嗯,我以为你可以指定一个 int 值传递给 rand(),我的错误。但是,我会除以 RAND_MAX。 stackoverflow.com/questions/1557208/…
      • 非常感谢你,对不起我的意思......但我得到了很多愤怒的答案!我发现我做错了!非常感谢您花时间解决我的问题! :)
      猜你喜欢
      • 2014-04-11
      • 1970-01-01
      • 2011-07-07
      • 1970-01-01
      • 2018-08-24
      • 2012-09-27
      • 2011-08-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多