【问题标题】:Random Double Issues随机双重问题
【发布时间】:2020-11-04 06:23:15
【问题描述】:

我在生成随机双精度数时遇到了一些问题。我必须创建一个不带参数并返回双精度(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))

【问题讨论】:

  • 您放入“公式”的 randomInt 在 1 ... 100 范围内。那么您应该在公式中使用这些值,而不是 RAND_MAX!甚至更好:忘记您的 randomInt 并将您的 rand 调用放入公式中。另外:我不会每次都调用 srand ,但在您的程序开始时只调用一次。
  • randomDouble = LOWER_BOUND + ( rand() % 100 + 1 / (UPPER_BOUND - LOWER_BOUND)); 是这样的吗?我仍然得到 1 作为回报。
  • 不,LOWER_BOUND + ((double)rand() * (UPPER_BOUND - LOWER_BOUND)) / RAND_MAX

标签: c++


【解决方案1】:

首先,您没有在main 中调用randDouble,而是尝试打印函数本身。这将始终打印1true,具体取决于是否设置了boolalpha。如果您启用了更激进的警告级别,您的编译器会警告您。通常建议这样做。

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

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

使用现代的std::uniform_real_distribution 可以避免很多此类问题,它已经为您完成了所有艰苦的工作。

【讨论】:

  • 我认为我不能使用std::,这是作业的一小部分。我们还没有讨论过。
  • @VictorAmaro 您已经在使用std::cout。实际上,缺少的std:: 是您的代码甚至无法为我编译的原因。那么,std::uniform_real_distribution 是当前 C++ 标准的一部分,就像 intstd::coutstd::rand 一样,所有这些都是你使用的。如果您有特殊要求,请在问题中说明。
【解决方案2】:

你可以用更好、更干净的方式来做:

#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::。而且我必须在一个函数中执行它,才能在其他函数中调用它。
  • 查看此 [链接] tutorialspoint.com/cplusplus/cpp_namespaces.htm 以了解 std 是什么。你可以在 main() 全局定义前三行,然后在你需要的任何函数中使用 dist(gen)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-14
相关资源
最近更新 更多