我想生成一个随机双精度浮点数 x
,其中:0 <= x <= 1
:
double x = ((double) rand() / (RAND_MAX));
这是从 [0,1] 范围内获取随机小数的正确方法吗?
我想生成一个随机双精度浮点数 x
,其中:0 <= x <= 1
:
double x = ((double) rand() / (RAND_MAX));
这是从 [0,1] 范围内获取随机小数的正确方法吗?
是的,因为std::rand()
会返回0
和RAND_MAX
。然而,如果您可以使用C++11,可以使用std::uniform_real_distribution
代替。
还要记得初始化随机数生成器,否则每次执行都将得到相同的序列。如果使用std::rand
,std::srand(std::time(0))
几乎总是足够的。
是的。
虽然有些括号是多余的。
取决于您的应用程序,您是否可以信任系统的rand(3)函数。对于严肃的蒙特卡罗模拟,您需要从数值库中获取经过充分文档化的随机数生成器。
是的,我相信在随后生成时它会给你一个随机序列中的0和1。但一定要初始化随机数生成函数,以避免反复获得相同的序列。
#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;
}
是的,但我建议将RAND_MAX也转换为double:
double r = ((double)rand() / (double)(RAND_MAX));
虽然有时候不必要,但编译器可能会根据目标变量和源变量类型自动将运算符转换为另一种类型。例如:
3.5 / 2 可能等于 1 而不是 1.75,因为除数是整数,为避免这种情况,你必须这样做:
3.5 / 2.0 或 3.5 / (double)2
3.5/2
永远不会等于1
,整数总是会被转换为浮点数,而不是相反。如果你对类型转换规则不熟悉,显式地进行类型转换可能会使代码稍微容易理解一些,但这从来不是必须的,并且除非你操作有误,否则不会改变行为。 - Mike Seymour