如何将一个类合并到这个随机生成器中?

时间:2016-10-11 05:25:34

标签: c++ class oop

我想添加一个选项,在我的项目中包含一个Integer和Double类,并希望得到一些帮助,因为我被卡住了。

头:

#ifndef RANDOM
#define RANDOM

#include <iostream>
#include <vector>
#include <ctime>
#include <cstdlib>
#include <algorithm>
#include "Double.h"

const int Int_b = 250;//these are for main
const int Int_s = 225;

class Random
{
private:
    std::vector<double> vectx;
    double _min, _max;
    int currIndex;
    void fillVect(double min, double max);
    //void fillVect(Double min, Double max);
    void shuffle();

public:
    Random();
    Random(double min, double max);
    //Random(Double min, Double max);
    Random(int seed);
    int nextInt();
    //Integer nextInteger();
    double nextDbl();
    //Double nextDouble();
    //void setRange(Double min, Double max);
    void setRange(double min, double max);
};
#endif

评论代码是我想添加的代码

CPP:

#include "Random.h"
#include "Double.h"
using namespace std;
Random::Random() {
    srand(unsigned(time(0)));
    fillVect(0.0, RAND_MAX);
}
Random::Random(double min, double max) {
    srand(unsigned(time(0)));
    fillVect(min, max);
}
/*Random::Random(Double min, Double max)
{
    srand(unsigned(time(0)));
    fillVect(min, max);
}*/
Random::Random(int seed) {
    srand(seed);
    fillVect(0.0, RAND_MAX);
}
void Random::fillVect(double min, double max) {
    vectx.clear();
    currIndex = 0;
    for (unsigned i = 0; i < Int_b; ++i)
    {
        double r = (((double)rand() / (double)RAND_MAX * (max - min)) + min);
        vectx.push_back(r);
    }
    shuffle();
}
/*void Random::fillVect(Double min, Double max) {
    vectx.clear();
    currIndex = 0;
    for (unsigned i = 0; i < Int_b; ++i)
    {
        Double r = (((Double)rand() / (Double)RAND_MAX * (max - min)) + min);
        vectx.push_back(r);
    }
    shuffle();
}*/
void Random::shuffle() {
    random_shuffle(vectx.begin(), vectx.end());
}
int Random::nextInt() {
    if (currIndex > Int_s)
    {
        currIndex = 0;
        shuffle();
    }
    return (int)vectx[currIndex++];
}
double Random::nextDbl() {
    if (currIndex > Int_s)
    {
        currIndex = 0;
        shuffle();
    }
    return vectx[currIndex++];
}
void Random::setRange(double min, double max) {
    vectx.clear();
    fillVect(min, max);
}

这是我的尝试,但我无法绕过它。

这是我的双课。

class Double
{
private:
    double data;
public:
    Double();
    Double(double d);
    Double(const Double &d);
    Double(const Integer &i);
    void equals(double d);
    Double add(const Double &d);
    Double sub(const Double &d);
    Double mul(const Double &d);
    Double div(const Double &d);
    Double add(double d);
    Double sub(double d);
    Double mul(double d);
    Double div(double d);
    double toDouble() const;
    Double operator + (const Double &d);
    Double operator - (const Double &d);
    Double operator * (const Double &d);
    Double operator / (const Double &d);
    Double operator = (const Double &d);
    Double operator = (double d);
    bool operator == (const Double &d);
    bool operator == (double d);
    bool operator != (const Double &d);
    bool operator != (double d);
};

2 个答案:

答案 0 :(得分:0)

Random::Random(Double min, Double max)

你能做的最好的事情是

Random::Random(Double min, Double max)
{
    fillVect(min.toDouble(), max.toDouble());
}

并将void Random::fillVect(Double min, Double max)的概念视为冗余。但如果你必须实现它,那么

Random::Random(Double min, Double max)
{
    fillVect(min, max);
}

void Random::fillVect(Double min, Double max) {
    vectx.clear();
    currIndex = 0;
    for (unsigned i = 0; i < Int_b; ++i)
    {
        double r = (((double)rand() / (double)RAND_MAX * (max.toDouble() - min)) + min.toDouble());
        vectx.push_back(r);
    }
    shuffle();
}

但要注意这是愚蠢的。对fillVect算法所做的任何更改都必须在两个地方进行,这会打开整个系列的可能错误。假设您改变一个而忘记改变另一个。或者您发现了一个错误,只能将其修复为一个错误。或者因为拼写错误,你只有一个错误。重复的代码浪费时间编写,调试和维护。为了什么?所以你在另一个地方打电话给toDouble(可能现在已经多次了for循环。请阅读“循环提升”来解决这个问题?)

Double nextDouble();利用Double::Double(double d)

答案 1 :(得分:-3)

为什么当一个简单的演员可以完成这项工作时重复自己? 例如,您可以说:

fillVect( min.toDouble(), max.toDouble() )

最小和最大是双重类型。