随机的双重问题

Random Double Issues

本文关键字:问题 随机      更新时间:2023-10-16

我在生成随机双位数时遇到了一些麻烦。我必须创建一个函数,它不接受任何参数,并返回一个双精度(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,而是尝试打印函数本身。这将始终打印1true,具体取决于是否设置了boolalpha。如果启用了更激进的警告级别,编译器就会警告您。一般建议这样做。

修正后,您会注意到总是得到0。这是因为randomInt / RAND_MAX总是零,因为截断整数除法。

当你修复这个问题时,你会注意到返回的值不是你想要的,因为你的公式是不正确的。

使用现代的std::uniform_real_distribution可以避免很多这样的问题,它已经为你做了所有的艰苦工作。

你可以用一种更好、更简洁的方式来做:

#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,不能在早期版本上运行。