【问题标题】:Generating random double between 1 and 100 in C [duplicate]在C中生成1到100之间的随机双精度[重复]
【发布时间】:2021-01-06 21:12:54
【问题描述】:

所以这适用于 1 到 100 之间的 10 个随机整数:

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

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

    for (int i = 0; i < 10; i++) {
        int random = rand() % 100 + 1;
        printf("The random integer is: %d\n", random);
    }
}

但是,如果我想在该范围内随机生成双精度数,我该怎么做?我尝试将random 的声明更改为double,并像这样在RHS 上使用强制转换:

double random = (double) rand() % 100 + 1;

我希望这个问题能得到很好的表述。

【问题讨论】:

  • 我标记为重复的答案会生成一个 0 到 1 的随机数,但是你可以乘以 99 并加 1 得到 1 到 100 之间的随机数。
  • 试试drand48 或类似的。
  • 目前,此问题和链接问题的所有答案except one 都存在量化问题 - 如果RAND_MAX 为 32767,则生成的随机数将是低质量的。如果您确实需要 double 类型提供的 52 位精度,则必须多次调用 rand(),如该答案中所述。
  • 您想考虑使用 Chux 的 this function,它看起来非常合理和高质量。如果您有一个非常糟糕的随机数生成器,您可以将 RANDOM_BITS 定义更改为更小。

标签: c


【解决方案1】:

您正在做的事情会“起作用”,但可能不是您想要的方式。关键是要定义 random double 的含义。通常,我们的意思是具有系统允许的最大精度的双精度数。

幸运的是,我们知道 rand 返回的数字介于 0 和 RAND_MAX 之间,无论该值是什么。 (32767 曾经是一个常见的选择。)我们可以除以这个限制来生成一个介于 0 和 1 之间的值,然后可以将其缩放到您需要的任何范围,如下所示:

double random = ((double) rand() / RAND_MAX) * (100 - 1) + 1;

如果您想要一个介于 1.5 和 9 之间的值,您可以采用非常相似的方式:

double random = ((double) rand() / RAND_MAX) * (9 - 1.5) + 1.5;

【讨论】:

  • 我复制并粘贴了你的建议,但是一旦我随机打印 10 次,我似乎只得到内存地址,所有 9 位长,有些是负数,有些是正数。
  • @Parseval 请记住将数字打印为双精度数,而不是整数。 (%g 而不是 %d 作为 printf 的参数。)
  • 啊,这对于未经训练的眼睛来说太容易错过了。非常感谢人!这清除了一切!
猜你喜欢
  • 2016-01-08
  • 1970-01-01
  • 2016-06-11
  • 2011-02-11
  • 2011-08-19
  • 1970-01-01
  • 1970-01-01
  • 2016-02-14
  • 1970-01-01
相关资源
最近更新 更多