随机双重问题
我在生成随机双数时遇到了一些麻烦。我必须创建一个不带参数的函数,并返回一个double(0到100之间),即随机数。期待每次我尝试创建它时,它会返回值1.随机双重问题
我还必须使用一些符号常量。
#include <iostream>
#include <iomanip>
#include <ctime>
#include <cstdlib>
double randDouble();
const double UPPER_BOUND = 100.0;
const double LOWER_BOUND = 0.0;
const int ARRAY_SIZE = 100;
double randDouble()
{
int randomInt;
double randomDouble;
srand(time(NULL));
randomInt = rand() % 100 + 1;
randomDouble = LOWER_BOUND + (randomInt/RAND_MAX/(UPPER_BOUND - LOWER_BOUND));
return randomDouble;
}
int main()
{
cout << randDouble();
return 0;
}
另一件事是,我必须使用预先给定的公式。
lower bound + (random integer/(maximum possible random number/(upper bound - lower bound))
首先,你是不是在你的main
调用randDouble
,但尝试打印功能本身。这将始终打印1
或true
,具体取决于是否设置了boolalpha
。如果你启用了一个合理的警告级别,你的编译器会警告你。
当你解决这个问题时,你会注意到你总是得到零。这是因为randomInt/RAND_MAX
由于截断了整数除法而始终为零。
当您修复该问题时,您会注意到返回的值不符合要求,因为您的公式不正确。
然后最后,你只需扔垃圾,并使用std::uniform_real_distribution
已经为你做了所有的辛苦工作。
我不认为我能够使用'std ::',这是一个任务的一小部分。我们还没有讨论过。 –
@VictorAmaro你已经在使用'std :: cout'。实际上,缺少的'std ::'就是为什么你的代码甚至不能为我编译。然后,'std :: uniform_real_distribution'是当前C++标准的一部分,就像'int','std :: cout'和'std :: rand'一样,所有这些都是你使用的。如果您有特殊要求,请在您的问题中说明。 –
你可以做一个更好的和更清洁的方式:
#include<random>
#include<iostream>
using namespace std;
int main(){
std::random_device rand_dev;
std::mt19937 gen(rand_dev());
std::uniform_real_distribution<double> dist(0, 100);
// demo.
for(int i = 0; i < 100; ++i){
// call dist(gen) whenever you need a random variable.
cout << dist(gen) << '\n';
}
return 0;
}
该代码使用C++ 11并不会更早版本上工作。
好的,所以这只是作业的一小部分。我们甚至还没有讨论过'std ::'。我必须在一个函数中完成它,以便能够在其他函数中调用它。 –
查看此[link] http://www.tutorialspoint.com/cplusplus/cpp_namespaces.htm以了解std是什么。 您可以在全局main()中定义前三行,然后在需要的任何函数中使用dist(gen)。 –
您放入“公式”的randomInt范围是1 ... 100.然后,您应该在公式中使用这些值,而不是在RAND_MAX中使用这些值!或者甚至更好:忘记你的randomInt并把你的rand调用放入公式中。另外:我不会每次都打电话给srand,但是在你的节目开始时只有一次。 – nv3
'randomDouble = LOWER_BOUND +(rand()%100 + 1 /(UPPER_BOUND - LOWER_BOUND));'所以像这样?我仍然得到1作为回报。 –
不, LOWER_BOUND +((double)rand()*(UPPER_BOUND - LOWER_BOUND))/ RAND_MAX – nv3