在最小值和最大值之间生成随机双精度浮点数。

7
double get_random(double min, double max) {
  /* Returns a random double between min and max */

  return min * ((double) rand() / (double) RAND_MAX) - max;
}

这是我生成在最小值和最大值之间的随机双精度数的函数。然而,当我调用get_random(-1.0, 1.0);时,它返回-2.0到-1.0之间的值。你知道我做错了什么并且如何修复吗?

3
(rand/RAND_MAX) 生成一个在0.0和1.0之间的数字。因此,将这两个极端值代入方程的其余部分,你就能看出为什么它无法工作。 - Oliver Charlesworth
请看:https://dev59.com/WXRB5IYBdhLWcg3wN1AQ - Trevor Hickey
2个回答

22

公式不应该是这样吗?

(max - min) * ( (double)rand() / (double)RAND_MAX ) + min
  • (double)rand() / (double)RAND_MAX 返回介于 01 之间的随机数。
  • (max - min) * ( (double)rand() / (double)RAND_MAX ) 返回介于 0max - min 之间的随机数。
  • 整个表达式将返回介于 0 + minmin + (max-min) 之间的随机数,即介于 minmax 之间。

2
仅作警告:此方法可能会在您选择的范围内生成很小一部分,远低于1%的随机数。如果可用,请使用<random>以获得更高质量的随机双精度数。 - Robert Cooper

1

您可以使用此功能生成随机的双精度或浮点数:

((double) rand()*(max-min)/(double)RAND_MAX-min);

这个与被接受的答案相比有什么具体的优势吗?你能再解释一下吗? - jogojapan
2
我同意@jogojapan的观点,最终的"-min"是与被接受答案的"+min"唯一的区别(据我所知),因此这个答案是错误的。 - Ken Y-N

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接