是否有可能使用math.h的rand()生成随机浮点数,包括次正规数?

时间:2015-06-30 20:04:44

标签: c random c99

我想生成包含次正规浮点数的浮点数。我们是否可以使用rand()的例程math.h来实现此目标编程语言应为C99。我希望这个随机数从[-1e308到1e308]均匀分布。

3 个答案:

答案 0 :(得分:1)

写入联合的一个字段并从另一个字段读取通常会遇到麻烦,但以下在许多系统上运行良好:

这将生成非数字。 NAN

double random_double(void) {
  union {
    unsigned char uc[sizeof (double)];
    double d;
  } u;
  unsigned i;
  for (i=0; i<sizeof u.uc; i++) {
    u.uc[i] = rand();
  }
  return u.d;
}

一种不返回NAN的方法。另请参阅IEEE 754 specifies an isNaN() predicate which does not raise an exception even when used with signaling NaN

double rand_double_NotNAN(void) {
  union {
    double d;
    unsigned char uc[sizeof(double)];
  } u;
  do {
    for (size_t i = 0; i < sizeof(double); i++) {
      u.uc[i] = rand();
    }
  } while (isnan(u.d));
  return u.d;
}

答案 1 :(得分:1)

效率不高,但要正确回答这个问题:

首先定义从整数范围(0,MAX_RAND)到实数的映射。在定义此映射时,确切地确定您想要的分布:统一所有实数,或对数统一,或其他。编写一个给定范围内的整数的函数,根据此映射返回一个double。现在使用rand()并将其提供给您的函数。

答案 2 :(得分:0)

union {
  int a;
  float b;
} Number;

Number.a = rand();
printf("%f\n", Number.b);

这使用随机整数的位掩码来创建具有相同位掩码的浮点数。