【问题标题】:How do I generate a random double between 0 and max (in C)?如何在 0 和 max 之间生成随机双精度(在 C 中)?
【发布时间】:2019-01-07 12:32:31
【问题描述】:

这是我为生成随机双精度所做的:

int main()
{
    srand(time(NULL));

    double max = 10.0;
    double x = (double)rand()/(double)(RAND_MAX/max);

    printf("The random number is %f \n", x);
}

虽然这个生成的数字本质上是随机的,但它仍然不够随机。

我第一次运行这个,我得到了 7.303385 然后我得到了 7.320475。 然后我得到了 7.332377。 然后我得到了 7.345195。

你明白了。看起来我的代码只生成 7.3 和 7.4 之间的随机数。

我在这里做错了什么?

编辑:

我刚刚注意到的另一件奇怪的事情:

我稍微修改了代码:

int main()
{
    srand(time(NULL));

    double max = 10.0;
    double x = (double)rand()/(double)(RAND_MAX/max);
    double y = (double)rand()/(double)(RAND_MAX/max);

    printf("The random number is %f \n", x);
    printf("The random number is %f \n", y);
}

当我运行它时,x 总是给我一个介于 7.3 和 7.4 之间的值,所以这里没有变化。但是, y 总是在 0 到 10 之间生成,这正是我想要的。那么为什么 x 表现不同呢?

【问题讨论】:

  • 如果您删除 srand(time(NULL)); 会发生什么?
  • 互联网上有 许多 教程,这里有很多关于获取某个范围内的数字的问题(例如 010)。请先搜索一下。
  • 顺便说一句,您是在循环中执行所有这些操作吗?包括srand 电话?请尝试创建minimal reproducible example 向我们展示。
  • 确保您致电srand() 一次。我有一些用于统一生成随机数的代码here,但正如那个家伙所说,互联网上有很多。
  • 在不相关的说明中,您不需要演员表。因为maxdouble 类型,所以RAND_MAX / max 的结果也将是double。因此,第二个分区也将是double 类型。所以只有rand() / (RAND_MAX / max)就够了。

标签: c random


【解决方案1】:

我不知道你的代码是什么样的,但这很好用:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main()
{
  srand(time(NULL));    // call srand once only

  for (int i = 0; i < 50; i++)
  {
//  srand(time(NULL));  // don't put srand here

    double max = 10.0;

    double x = (double)rand() / (double)(RAND_MAX / max);
    double y = (double)rand() / (double)(RAND_MAX / max);

    printf("The random number is %f \n", x);
    printf("The random number is %f \n", y);
  }
}

不同的问题:

您可能需要RAND_MAX/max; 而不是(double)(RAND_MAX/max);,否则如果max 很大,您可能会遇到问题。

【讨论】:

  • 是的,确实有效。但是,当它不在循环内时,为什么它不能正常工作呢?为什么 x 总是在 7.3 和 7.4 之间?
  • 您可能在循环中包含了srand() 调用。不要那样做。您应该只初始化一次 RNG。
  • 我很困惑......评论中提到的 op (Bob K) 不是在循环中运行的(尽管如果二进制文件在没有太多延迟的情况下重复运行,可能会出现类似的效果),但随后 User95(我假设与操作有关系)意味着存在循环。
  • @SanderDeDycker 是的,它肯定是在一个循环中。 OP 可能误解了评论。
  • @User95 它不能正常工作,因为 time 返回自 1970 年 1 月 1 日 00:00 小时以来经过的秒数。因此,在一秒钟内连续调用 srand(time()) 将播种随机数生成器一遍又一遍地使用相同的数字,因此调用rand 将产生相同的随机数序列。
猜你喜欢
  • 2016-06-11
  • 1970-01-01
  • 2016-02-14
  • 2011-02-11
  • 2013-08-10
  • 1970-01-01
  • 2021-01-06
  • 2011-05-02
  • 2016-01-08
相关资源
最近更新 更多