在C++中从[0,1]获取随机双精度数

5

我想生成一个随机双精度浮点数 x,其中:0 <= x <= 1

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

这是从 [0,1] 范围内获取随机小数的正确方法吗?


是的,看起来是正确的。 - Abhishek Bansal
@AbhishekBansal:谢谢!但是它会同时给我0和1吗?你确定吗? - nullpointer
4
去掉一半的括号,它们是多余的。 - Pete Becker
有人可能会发现这更有用:对于范围[min,max],您可以使用:(((double)rand()*(max - min) / RAND_MAX) + min) - JasoonS
5个回答

8

是的,因为std::rand()会返回0RAND_MAX。然而,如果您可以使用C++11,可以使用std::uniform_real_distribution代替。

还要记得初始化随机数生成器,否则每次执行都将得到相同的序列。如果使用std::randstd::srand(std::time(0))几乎总是足够的。


很遗憾,我不能使用c++11 :( - nullpointer
1
@nullpointer:那么你最初的方法是完全有效的,可以运行。 - Zeta

3

是的。

虽然有些括号是多余的。

取决于您的应用程序,您是否可以信任系统的rand(3)函数。对于严肃的蒙特卡罗模拟,您需要从数值库中获取经过充分文档化的随机数生成器。


2

是的,我相信在随后生成时它会给你一个随机序列中的0和1。但一定要初始化随机数生成函数,以避免反复获得相同的序列。


1
如果您正在寻找一个随机的双精度数,这就是我实现它的方法。 如果您正在寻找一个函数来实现它,我可以编辑这篇文章。 rand() 函数包含在 stdlib.h 中。
    #include <stdlib.h>
    #include <time.h>
    #include <iostream>
    using namespace std;
    int main()
    { 
        double num;
        double max;

        srand(time(NULL));

        cout << "Enter a number.";
        cin >> max;

        num = (((double)rand()*(max) / RAND_MAX) - max) *(-1);

        cout << num;


    }

((double)rand()(max) / RAND_MAX) 与其效果完全相同。但是,如果要在[min,max]范围内生成数字,则可以使用:(((double)rand()(max - min) / RAND_MAX) + min) - JasoonS

1

是的,但我建议将RAND_MAX也转换为double:

double r = ((double)rand() / (double)(RAND_MAX));

虽然有时候不必要,但编译器可能会根据目标变量和源变量类型自动将运算符转换为另一种类型。例如:

3.5 / 2 可能等于 1 而不是 1.75,因为除数是整数,为避免这种情况,你必须这样做:

3.5 / 2.0 或 3.5 / (double)2


7
不,3.5/2永远不会等于1,整数总是会被转换为浮点数,而不是相反。如果你对类型转换规则不熟悉,显式地进行类型转换可能会使代码稍微容易理解一些,但这从来不是必须的,并且除非你操作有误,否则不会改变行为。 - Mike Seymour
嗯...可能是一个老旧的有缺陷的编译器,它没有遵守规则,我已经被这个污点困扰很长时间了 :) - Mauro H. Leggieri

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