2015-10-20 130 views
0

我在生成随机双数时遇到了一些麻烦。我必须创建一个不带参数的函数,并返回一个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))

+0

您放入“公式”的randomInt范围是1 ... 100.然后,您应该在公式中使用这些值,而不是在RAND_MAX中使用这些值!或者甚至更好:忘记你的randomInt并把你的rand调用放入公式中。另外:我不会每次都打电话给srand,但是在你的节目开始时只有一次。 – nv3

+0

'randomDouble = LOWER_BOUND +(rand()%100 + 1 /(UPPER_BOUND - LOWER_BOUND));'所以像这样?我仍然得到1作为回报。 –

+0

不, LOWER_BOUND +((double)rand()*(UPPER_BOUND - LOWER_BOUND))/ RAND_MAX – nv3

回答

1

首先,你是不是在你的main调用randDouble,但尝试打印功能本身。这将始终打印1true,具体取决于是否设置了boolalpha。如果你启用了一个合理的警告级别,你的编译器会警告你。

当你解决这个问题时,你会注意到你总是得到零。这是因为randomInt/RAND_MAX由于截断了整数除法而始终为零。

当您修复该问题时,您会注意到返回的值不符合要求,因为您的公式不正确。

然后最后,你只需扔垃圾,并使用std::uniform_real_distribution已经为你做了所有的辛苦工作。

+0

我不认为我能够使用'std ::',这是一个任务的一小部分。我们还没有讨论过。 –

+0

@VictorAmaro你已经在使用'std :: cout'。实际上,缺少的'std ::'就是为什么你的代码甚至不能为我编译。然后,'std :: uniform_real_distribution'是当前C++标准的一部分,就像'int','std :: cout'和'std :: rand'一样,所有这些都是你使用的。如果您有特殊要求,请在您的问题中说明。 –

1

你可以做一个更好的和更清洁的方式:

#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并不会更早版本上工作。

+0

好的,所以这只是作业的一小部分。我们甚至还没有讨论过'std ::'。我必须在一个函数中完成它,以便能够在其他函数中调用它。 –

+0

查看此[link] http://www.tutorialspoint.com/cplusplus/cpp_namespaces.htm以了解std是什么。 您可以在全局main()中定义前三行,然后在需要的任何函数中使用dist(gen)。 –